Mercurial > public > mercurial-scm > hg
annotate rust/hg-core/src/revlog/mod.rs @ 52664:f5091286b10c
packaging: modernize (compat PEP 517) with less distutils and setup.py calls
- setup.py: less distutils imports and setuptools required
distutils is deprecated and one should import commands from setuptools to support
modern workflows depending on PEP 517 and 518.
Moreover, for Python >=3.12, distutils comes from setuptools. It corresponds to old and
unmaintain code that do not support PEP 517.
The PEP 517 frontends (pip, build, pipx, PDM, UV, etc.) are responsible for creating a
venv just for the build. The build dependencies (currently only setuptools) are specified
in the pyproject.toml file. Therefore, there is no reason to support building without
setuptools.
Calling directly setup.py is deprecated and we have to use a PEP 517 frontend.
For this commit we use pip with venv.
- run-tests.py: install with pip instead of direct call of setup.py
Mercurial is then built in an isolated environment.
- Makefile: use venv+pip instead of setup.py
author | paugier <pierre.augier@univ-grenoble-alpes.fr> |
---|---|
date | Wed, 08 Jan 2025 05:07:00 +0100 |
parents | 393ad2685fb4 |
children | df7fb698f7a8 |
rev | line source |
---|---|
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
1 // Copyright 2018-2023 Georges Racinet <georges.racinet@octobus.net> |
44005
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
2 // and Mercurial contributors |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
3 // |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
4 // This software may be used and distributed according to the terms of the |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
5 // GNU General Public License version 2 or any later version. |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
6 //! Mercurial concepts for handling revision history |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
7 |
44143
7f86426fdd2c
rust-node: binary Node ID and conversion utilities
Georges Racinet <georges.racinet@octobus.net>
parents:
44142
diff
changeset
|
8 pub mod node; |
44142
63db6657d280
rust-nodemap: building blocks for nodetree structures
Georges Racinet <georges.racinet@octobus.net>
parents:
44088
diff
changeset
|
9 pub mod nodemap; |
46090
9eb07ab3f2d4
rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents:
45539
diff
changeset
|
10 mod nodemap_docket; |
45539
aebc976fd7d5
hg-core: add path_encode
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45533
diff
changeset
|
11 pub mod path_encode; |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
12 use inner_revlog::CoreRevisionBuffer; |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
13 use inner_revlog::InnerRevlog; |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
14 use inner_revlog::RevisionBuffer; |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
15 use memmap2::MmapOptions; |
52178
bd8081e9fd62
rust: don't star export from the `revlog` module
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52177
diff
changeset
|
16 pub use node::{FromHexError, Node, NodePrefix, NULL_NODE, NULL_NODE_ID}; |
52156
039b7caeb4d9
rust-revlog: introduce an `options` module
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52155
diff
changeset
|
17 use options::RevlogOpenOptions; |
45532
c2317b7624fd
hg-core: add `Changlog` a specialized `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45526
diff
changeset
|
18 pub mod changelog; |
52154
0744248cc541
rust-revlog: add compression helpers
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52056
diff
changeset
|
19 pub mod compression; |
52155
426696af24d3
rust-revlog: add file IO helpers
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52154
diff
changeset
|
20 pub mod file_io; |
47961
4d2a5ca060e3
rust: Add a Filelog struct that wraps Revlog
Simon Sapin <simon.sapin@octobus.net>
parents:
46821
diff
changeset
|
21 pub mod filelog; |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44973
diff
changeset
|
22 pub mod index; |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
23 pub mod inner_revlog; |
45533
89ac95bd4993
hg-core: add `Manifest` a specialized `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45532
diff
changeset
|
24 pub mod manifest; |
52156
039b7caeb4d9
rust-revlog: introduce an `options` module
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52155
diff
changeset
|
25 pub mod options; |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44973
diff
changeset
|
26 pub mod patch; |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
27 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
28 use std::borrow::Cow; |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
29 use std::io::ErrorKind; |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
30 use std::io::Read; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
31 use std::ops::Deref; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
32 use std::path::Path; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
33 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
34 use self::nodemap_docket::NodeMapDocket; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
35 use crate::errors::HgError; |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
36 use crate::errors::IoResultExt; |
51861
0604673428b7
rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51620
diff
changeset
|
37 use crate::exit_codes; |
52178
bd8081e9fd62
rust: don't star export from the `revlog` module
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52177
diff
changeset
|
38 use crate::revlog::index::Index; |
bd8081e9fd62
rust: don't star export from the `revlog` module
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52177
diff
changeset
|
39 use crate::revlog::nodemap::{NodeMap, NodeMapError}; |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
40 use crate::vfs::Vfs; |
51864 | 41 use crate::vfs::VfsImpl; |
44142
63db6657d280
rust-nodemap: building blocks for nodetree structures
Georges Racinet <georges.racinet@octobus.net>
parents:
44088
diff
changeset
|
42 |
44005
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
43 /// As noted in revlog.c, revision numbers are actually encoded in |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
44 /// 4 bytes, and are liberally converted to ints, whence the i32 |
50976
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
45 pub type BaseRevision = i32; |
44005
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
46 |
50976
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
47 /// Mercurial revision numbers |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
48 /// In contrast to the more general [`UncheckedRevision`], these are "checked" |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
49 /// in the sense that they should only be used for revisions that are |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
50 /// valid for a given index (i.e. in bounds). |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
51 #[derive( |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
52 Debug, |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
53 derive_more::Display, |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
54 Clone, |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
55 Copy, |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
56 Hash, |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
57 PartialEq, |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
58 Eq, |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
59 PartialOrd, |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
60 Ord, |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
61 )] |
50976
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
62 pub struct Revision(pub BaseRevision); |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
63 |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
64 impl format_bytes::DisplayBytes for Revision { |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
65 fn display_bytes( |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
66 &self, |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
67 output: &mut dyn std::io::Write, |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
68 ) -> std::io::Result<()> { |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
69 self.0.display_bytes(output) |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
70 } |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
71 } |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
72 |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
73 /// Unchecked Mercurial revision numbers. |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
74 /// |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
75 /// Values of this type have no guarantee of being a valid revision number |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
76 /// in any context. Use method `check_revision` to get a valid revision within |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
77 /// the appropriate index object. |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
78 #[derive( |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
79 Debug, |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
80 derive_more::Display, |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
81 Clone, |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
82 Copy, |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
83 Hash, |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
84 PartialEq, |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
85 Eq, |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
86 PartialOrd, |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
87 Ord, |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
88 )] |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
89 pub struct UncheckedRevision(pub BaseRevision); |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
90 |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
91 impl format_bytes::DisplayBytes for UncheckedRevision { |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
92 fn display_bytes( |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
93 &self, |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
94 output: &mut dyn std::io::Write, |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
95 ) -> std::io::Result<()> { |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
96 self.0.display_bytes(output) |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
97 } |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
98 } |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
99 |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
100 impl From<Revision> for UncheckedRevision { |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
101 fn from(value: Revision) -> Self { |
50976
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
102 Self(value.0) |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
103 } |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
104 } |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
105 |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
106 impl From<BaseRevision> for UncheckedRevision { |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
107 fn from(value: BaseRevision) -> Self { |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
108 Self(value) |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
109 } |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
110 } |
44005
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
111 |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
112 /// Marker expressing the absence of a parent |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
113 /// |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
114 /// Independently of the actual representation, `NULL_REVISION` is guaranteed |
44088
b3ec1ea95ee6
rust-core: fix typo in comment
Aay Jay Chan <aayjaychan@itopia.com.hk>
parents:
44005
diff
changeset
|
115 /// to be smaller than all existing revisions. |
50976
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
116 pub const NULL_REVISION: Revision = Revision(-1); |
44005
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
117 |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
118 /// Same as `mercurial.node.wdirrev` |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
119 /// |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
120 /// This is also equal to `i32::max_value()`, but it's better to spell |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
121 /// it out explicitely, same as in `mercurial.node` |
44973
26114bd6ec60
rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44182
diff
changeset
|
122 #[allow(clippy::unreadable_literal)] |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
123 pub const WORKING_DIRECTORY_REVISION: UncheckedRevision = |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
124 UncheckedRevision(0x7fffffff); |
44005
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
125 |
46821
e8ae91b1a63d
rhg: raise wdir specific error for `hg debugdata`
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46431
diff
changeset
|
126 pub const WORKING_DIRECTORY_HEX: &str = |
e8ae91b1a63d
rhg: raise wdir specific error for `hg debugdata`
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46431
diff
changeset
|
127 "ffffffffffffffffffffffffffffffffffffffff"; |
e8ae91b1a63d
rhg: raise wdir specific error for `hg debugdata`
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46431
diff
changeset
|
128 |
44005
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
129 /// The simplest expression of what we need of Mercurial DAGs. |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
130 pub trait Graph { |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
131 /// Return the two parents of the given `Revision`. |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
132 /// |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
133 /// Each of the parents can be independently `NULL_REVISION` |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
134 fn parents(&self, rev: Revision) -> Result<[Revision; 2], GraphError>; |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
135 } |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
136 |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
137 #[derive(Clone, Debug, PartialEq)] |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
138 pub enum GraphError { |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
139 ParentOutOfRange(Revision), |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
140 } |
44181
3fb39dc2e356
rust-revlog: a trait for the revlog index
Georges Racinet <georges.racinet@octobus.net>
parents:
44143
diff
changeset
|
141 |
52041
652149ed64f0
rust: improve `InvalidRevision` error message
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51864
diff
changeset
|
142 impl std::fmt::Display for GraphError { |
652149ed64f0
rust: improve `InvalidRevision` error message
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51864
diff
changeset
|
143 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
652149ed64f0
rust: improve `InvalidRevision` error message
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51864
diff
changeset
|
144 match self { |
652149ed64f0
rust: improve `InvalidRevision` error message
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51864
diff
changeset
|
145 GraphError::ParentOutOfRange(revision) => { |
652149ed64f0
rust: improve `InvalidRevision` error message
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51864
diff
changeset
|
146 write!(f, "parent out of range ({})", revision) |
652149ed64f0
rust: improve `InvalidRevision` error message
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51864
diff
changeset
|
147 } |
652149ed64f0
rust: improve `InvalidRevision` error message
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51864
diff
changeset
|
148 } |
652149ed64f0
rust: improve `InvalidRevision` error message
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51864
diff
changeset
|
149 } |
652149ed64f0
rust: improve `InvalidRevision` error message
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51864
diff
changeset
|
150 } |
652149ed64f0
rust: improve `InvalidRevision` error message
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51864
diff
changeset
|
151 |
51616
b08c5fbe0e70
rust: blanket implementation of Graph for Graph references
Georges Racinet <georges.racinet@octobus.net>
parents:
51253
diff
changeset
|
152 impl<T: Graph> Graph for &T { |
b08c5fbe0e70
rust: blanket implementation of Graph for Graph references
Georges Racinet <georges.racinet@octobus.net>
parents:
51253
diff
changeset
|
153 fn parents(&self, rev: Revision) -> Result<[Revision; 2], GraphError> { |
b08c5fbe0e70
rust: blanket implementation of Graph for Graph references
Georges Racinet <georges.racinet@octobus.net>
parents:
51253
diff
changeset
|
154 (*self).parents(rev) |
b08c5fbe0e70
rust: blanket implementation of Graph for Graph references
Georges Racinet <georges.racinet@octobus.net>
parents:
51253
diff
changeset
|
155 } |
b08c5fbe0e70
rust: blanket implementation of Graph for Graph references
Georges Racinet <georges.racinet@octobus.net>
parents:
51253
diff
changeset
|
156 } |
b08c5fbe0e70
rust: blanket implementation of Graph for Graph references
Georges Racinet <georges.racinet@octobus.net>
parents:
51253
diff
changeset
|
157 |
44181
3fb39dc2e356
rust-revlog: a trait for the revlog index
Georges Racinet <georges.racinet@octobus.net>
parents:
44143
diff
changeset
|
158 /// The Mercurial Revlog Index |
3fb39dc2e356
rust-revlog: a trait for the revlog index
Georges Racinet <georges.racinet@octobus.net>
parents:
44143
diff
changeset
|
159 /// |
3fb39dc2e356
rust-revlog: a trait for the revlog index
Georges Racinet <georges.racinet@octobus.net>
parents:
44143
diff
changeset
|
160 /// This is currently limited to the minimal interface that is needed for |
3fb39dc2e356
rust-revlog: a trait for the revlog index
Georges Racinet <georges.racinet@octobus.net>
parents:
44143
diff
changeset
|
161 /// the [`nodemap`](nodemap/index.html) module |
3fb39dc2e356
rust-revlog: a trait for the revlog index
Georges Racinet <georges.racinet@octobus.net>
parents:
44143
diff
changeset
|
162 pub trait RevlogIndex { |
3fb39dc2e356
rust-revlog: a trait for the revlog index
Georges Racinet <georges.racinet@octobus.net>
parents:
44143
diff
changeset
|
163 /// Total number of Revisions referenced in this index |
3fb39dc2e356
rust-revlog: a trait for the revlog index
Georges Racinet <georges.racinet@octobus.net>
parents:
44143
diff
changeset
|
164 fn len(&self) -> usize; |
3fb39dc2e356
rust-revlog: a trait for the revlog index
Georges Racinet <georges.racinet@octobus.net>
parents:
44143
diff
changeset
|
165 |
44973
26114bd6ec60
rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44182
diff
changeset
|
166 fn is_empty(&self) -> bool { |
26114bd6ec60
rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44182
diff
changeset
|
167 self.len() == 0 |
26114bd6ec60
rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44182
diff
changeset
|
168 } |
26114bd6ec60
rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44182
diff
changeset
|
169 |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
170 /// Return a reference to the Node or `None` for `NULL_REVISION` |
44181
3fb39dc2e356
rust-revlog: a trait for the revlog index
Georges Racinet <georges.racinet@octobus.net>
parents:
44143
diff
changeset
|
171 fn node(&self, rev: Revision) -> Option<&Node>; |
50971
c950fdba7472
rust: add `UncheckedRevision` type
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50743
diff
changeset
|
172 |
c950fdba7472
rust: add `UncheckedRevision` type
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50743
diff
changeset
|
173 /// Return a [`Revision`] if `rev` is a valid revision number for this |
51200
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51188
diff
changeset
|
174 /// index. |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51188
diff
changeset
|
175 /// |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51188
diff
changeset
|
176 /// [`NULL_REVISION`] is considered to be valid. |
51253
83de5a06f6eb
rust-index: allow inlining `check_revision` across crates
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51200
diff
changeset
|
177 #[inline(always)] |
50971
c950fdba7472
rust: add `UncheckedRevision` type
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50743
diff
changeset
|
178 fn check_revision(&self, rev: UncheckedRevision) -> Option<Revision> { |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
179 let rev = rev.0; |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
180 |
50976
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
181 if rev == NULL_REVISION.0 || (rev >= 0 && (rev as usize) < self.len()) |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
182 { |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
183 Some(Revision(rev)) |
50971
c950fdba7472
rust: add `UncheckedRevision` type
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50743
diff
changeset
|
184 } else { |
c950fdba7472
rust: add `UncheckedRevision` type
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50743
diff
changeset
|
185 None |
c950fdba7472
rust: add `UncheckedRevision` type
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50743
diff
changeset
|
186 } |
c950fdba7472
rust: add `UncheckedRevision` type
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50743
diff
changeset
|
187 } |
44181
3fb39dc2e356
rust-revlog: a trait for the revlog index
Georges Racinet <georges.racinet@octobus.net>
parents:
44143
diff
changeset
|
188 } |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
189 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
190 const REVISION_FLAG_CENSORED: u16 = 1 << 15; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
191 const REVISION_FLAG_ELLIPSIS: u16 = 1 << 14; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
192 const REVISION_FLAG_EXTSTORED: u16 = 1 << 13; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
193 const REVISION_FLAG_HASCOPIESINFO: u16 = 1 << 12; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
194 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
195 // Keep this in sync with REVIDX_KNOWN_FLAGS in |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
196 // mercurial/revlogutils/flagutil.py |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
197 const REVIDX_KNOWN_FLAGS: u16 = REVISION_FLAG_CENSORED |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
198 | REVISION_FLAG_ELLIPSIS |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
199 | REVISION_FLAG_EXTSTORED |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
200 | REVISION_FLAG_HASCOPIESINFO; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
201 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
202 const NULL_REVLOG_ENTRY_FLAGS: u16 = 0; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
203 |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
204 #[derive(Debug, derive_more::From, derive_more::Display)] |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
205 pub enum RevlogError { |
52041
652149ed64f0
rust: improve `InvalidRevision` error message
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51864
diff
changeset
|
206 #[display(fmt = "invalid revision identifier: {}", "_0")] |
652149ed64f0
rust: improve `InvalidRevision` error message
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51864
diff
changeset
|
207 InvalidRevision(String), |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
208 /// Working directory is not supported |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
209 WDirUnsupported, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
210 /// Found more than one entry whose ID match the requested prefix |
52343
393ad2685fb4
rust: make RevlogError AmbiguousPrefix case contain the actual prefix
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
52294
diff
changeset
|
211 AmbiguousPrefix(String), |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
212 #[from] |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
213 Other(HgError), |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
214 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
215 |
52343
393ad2685fb4
rust: make RevlogError AmbiguousPrefix case contain the actual prefix
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
52294
diff
changeset
|
216 impl From<(NodeMapError, String)> for RevlogError { |
393ad2685fb4
rust: make RevlogError AmbiguousPrefix case contain the actual prefix
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
52294
diff
changeset
|
217 fn from((error, rev): (NodeMapError, String)) -> Self { |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
218 match error { |
52343
393ad2685fb4
rust: make RevlogError AmbiguousPrefix case contain the actual prefix
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
52294
diff
changeset
|
219 NodeMapError::MultipleResults => RevlogError::AmbiguousPrefix(rev), |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
220 NodeMapError::RevisionNotInIndex(rev) => RevlogError::corrupted( |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
221 format!("nodemap point to revision {} not in index", rev), |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
222 ), |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
223 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
224 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
225 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
226 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
227 fn corrupted<S: AsRef<str>>(context: S) -> HgError { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
228 HgError::corrupted(format!("corrupted revlog, {}", context.as_ref())) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
229 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
230 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
231 impl RevlogError { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
232 fn corrupted<S: AsRef<str>>(context: S) -> Self { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
233 RevlogError::Other(corrupted(context)) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
234 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
235 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
236 |
51863
69b804c8e09e
rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51862
diff
changeset
|
237 #[derive(derive_more::Display, Debug, Copy, Clone, PartialEq, Eq)] |
51861
0604673428b7
rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51620
diff
changeset
|
238 pub enum RevlogType { |
0604673428b7
rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51620
diff
changeset
|
239 Changelog, |
0604673428b7
rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51620
diff
changeset
|
240 Manifestlog, |
0604673428b7
rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51620
diff
changeset
|
241 Filelog, |
0604673428b7
rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51620
diff
changeset
|
242 } |
0604673428b7
rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51620
diff
changeset
|
243 |
0604673428b7
rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51620
diff
changeset
|
244 impl TryFrom<usize> for RevlogType { |
0604673428b7
rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51620
diff
changeset
|
245 type Error = HgError; |
0604673428b7
rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51620
diff
changeset
|
246 |
0604673428b7
rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51620
diff
changeset
|
247 fn try_from(value: usize) -> Result<Self, Self::Error> { |
0604673428b7
rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51620
diff
changeset
|
248 match value { |
0604673428b7
rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51620
diff
changeset
|
249 1001 => Ok(Self::Changelog), |
0604673428b7
rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51620
diff
changeset
|
250 1002 => Ok(Self::Manifestlog), |
0604673428b7
rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51620
diff
changeset
|
251 1003 => Ok(Self::Filelog), |
0604673428b7
rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51620
diff
changeset
|
252 t => Err(HgError::abort( |
0604673428b7
rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51620
diff
changeset
|
253 format!("Unknown revlog type {}", t), |
0604673428b7
rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51620
diff
changeset
|
254 exit_codes::ABORT, |
0604673428b7
rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51620
diff
changeset
|
255 None, |
0604673428b7
rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51620
diff
changeset
|
256 )), |
0604673428b7
rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51620
diff
changeset
|
257 } |
0604673428b7
rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51620
diff
changeset
|
258 } |
0604673428b7
rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51620
diff
changeset
|
259 } |
0604673428b7
rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51620
diff
changeset
|
260 |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
261 pub struct Revlog { |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
262 inner: InnerRevlog, |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
263 /// When present on disk: the persistent nodemap for this revlog |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
264 nodemap: Option<nodemap::NodeTree>, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
265 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
266 |
50975
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50974
diff
changeset
|
267 impl Graph for Revlog { |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50974
diff
changeset
|
268 fn parents(&self, rev: Revision) -> Result<[Revision; 2], GraphError> { |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
269 self.index().parents(rev) |
50975
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50974
diff
changeset
|
270 } |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50974
diff
changeset
|
271 } |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
272 impl Revlog { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
273 /// Open a revlog index file. |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
274 /// |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
275 /// It will also open the associated data file if index and data are not |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
276 /// interleaved. |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
277 pub fn open( |
51864 | 278 // Todo use the `Vfs` trait here once we create a function for mmap |
279 store_vfs: &VfsImpl, | |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
280 index_path: impl AsRef<Path>, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
281 data_path: Option<&Path>, |
51188
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51117
diff
changeset
|
282 options: RevlogOpenOptions, |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
283 ) -> Result<Self, HgError> { |
51188
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51117
diff
changeset
|
284 Self::open_gen(store_vfs, index_path, data_path, options, None) |
50983
eccf7dc7c91e
revlog: make the rust test for node hex prefix resolution exercise the nodemap
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50982
diff
changeset
|
285 } |
eccf7dc7c91e
revlog: make the rust test for node hex prefix resolution exercise the nodemap
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50982
diff
changeset
|
286 |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
287 fn index(&self) -> &Index { |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
288 &self.inner.index |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
289 } |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
290 |
50983
eccf7dc7c91e
revlog: make the rust test for node hex prefix resolution exercise the nodemap
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50982
diff
changeset
|
291 fn open_gen( |
51864 | 292 // Todo use the `Vfs` trait here once we create a function for mmap |
293 store_vfs: &VfsImpl, | |
50983
eccf7dc7c91e
revlog: make the rust test for node hex prefix resolution exercise the nodemap
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50982
diff
changeset
|
294 index_path: impl AsRef<Path>, |
eccf7dc7c91e
revlog: make the rust test for node hex prefix resolution exercise the nodemap
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50982
diff
changeset
|
295 data_path: Option<&Path>, |
51188
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51117
diff
changeset
|
296 options: RevlogOpenOptions, |
50983
eccf7dc7c91e
revlog: make the rust test for node hex prefix resolution exercise the nodemap
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50982
diff
changeset
|
297 nodemap_for_test: Option<nodemap::NodeTree>, |
eccf7dc7c91e
revlog: make the rust test for node hex prefix resolution exercise the nodemap
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50982
diff
changeset
|
298 ) -> Result<Self, HgError> { |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
299 let index_path = index_path.as_ref(); |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
300 let index = open_index(store_vfs, index_path, options)?; |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
301 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
302 let default_data_path = index_path.with_extension("d"); |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
303 let data_path = data_path.unwrap_or(&default_data_path); |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
304 |
51188
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51117
diff
changeset
|
305 let nodemap = if index.is_inline() || !options.use_nodemap { |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
306 None |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
307 } else { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
308 NodeMapDocket::read_from_file(store_vfs, index_path)?.map( |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
309 |(docket, data)| { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
310 nodemap::NodeTree::load_bytes( |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
311 Box::new(data), |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
312 docket.data_length, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
313 ) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
314 }, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
315 ) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
316 }; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
317 |
50983
eccf7dc7c91e
revlog: make the rust test for node hex prefix resolution exercise the nodemap
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50982
diff
changeset
|
318 let nodemap = nodemap_for_test.or(nodemap); |
eccf7dc7c91e
revlog: make the rust test for node hex prefix resolution exercise the nodemap
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50982
diff
changeset
|
319 |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
320 Ok(Revlog { |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
321 inner: InnerRevlog::new( |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
322 Box::new(store_vfs.clone()), |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
323 index, |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
324 index_path.to_path_buf(), |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
325 data_path.to_path_buf(), |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
326 options.data_config, |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
327 options.delta_config, |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
328 options.feature_config, |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
329 ), |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
330 nodemap, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
331 }) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
332 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
333 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
334 /// Return number of entries of the `Revlog`. |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
335 pub fn len(&self) -> usize { |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
336 self.index().len() |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
337 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
338 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
339 /// Returns `true` if the `Revlog` has zero `entries`. |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
340 pub fn is_empty(&self) -> bool { |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
341 self.index().is_empty() |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
342 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
343 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
344 /// Returns the node ID for the given revision number, if it exists in this |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
345 /// revlog |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
346 pub fn node_from_rev(&self, rev: UncheckedRevision) -> Option<&Node> { |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
347 if rev == NULL_REVISION.into() { |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
348 return Some(&NULL_NODE); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
349 } |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
350 let rev = self.index().check_revision(rev)?; |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
351 Some(self.index().get_entry(rev)?.hash()) |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
352 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
353 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
354 /// Return the revision number for the given node ID, if it exists in this |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
355 /// revlog |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
356 pub fn rev_from_node( |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
357 &self, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
358 node: NodePrefix, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
359 ) -> Result<Revision, RevlogError> { |
50982
363620b934aa
revlog: fix a bug where NULL_NODE failed to be resolved to NULL_REV
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50743
diff
changeset
|
360 if let Some(nodemap) = &self.nodemap { |
50741
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
361 nodemap |
52343
393ad2685fb4
rust: make RevlogError AmbiguousPrefix case contain the actual prefix
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
52294
diff
changeset
|
362 .find_bin(self.index(), node) |
393ad2685fb4
rust: make RevlogError AmbiguousPrefix case contain the actual prefix
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
52294
diff
changeset
|
363 .map_err(|err| (err, format!("{:x}", node)))? |
52041
652149ed64f0
rust: improve `InvalidRevision` error message
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51864
diff
changeset
|
364 .ok_or(RevlogError::InvalidRevision(format!("{:x}", node))) |
50741
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
365 } else { |
52173
1da6995835b4
rust-revlog: move non-persistent-nodemap rev lookup to the index
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52167
diff
changeset
|
366 self.index().rev_from_node_no_persistent_nodemap(node) |
50982
363620b934aa
revlog: fix a bug where NULL_NODE failed to be resolved to NULL_REV
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50743
diff
changeset
|
367 } |
50740
0159b014f3ab
rust-revlog: split out method for `rev_from_node` without persistent nodemap
Georges Racinet <georges.racinet@octobus.net>
parents:
50505
diff
changeset
|
368 } |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
369 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
370 /// Returns whether the given revision exists in this revlog. |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
371 pub fn has_rev(&self, rev: UncheckedRevision) -> bool { |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
372 self.index().check_revision(rev).is_some() |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
373 } |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
374 |
52290
a3fa37bdb7ec
rust: normalize `_for_unchecked_rev` naming among revlogs and the index
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52178
diff
changeset
|
375 pub fn get_entry( |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
376 &self, |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
377 rev: Revision, |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
378 ) -> Result<RevlogEntry, RevlogError> { |
52290
a3fa37bdb7ec
rust: normalize `_for_unchecked_rev` naming among revlogs and the index
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52178
diff
changeset
|
379 self.inner.get_entry(rev) |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
380 } |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
381 |
52290
a3fa37bdb7ec
rust: normalize `_for_unchecked_rev` naming among revlogs and the index
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52178
diff
changeset
|
382 pub fn get_entry_for_unchecked_rev( |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
383 &self, |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
384 rev: UncheckedRevision, |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
385 ) -> Result<RevlogEntry, RevlogError> { |
52290
a3fa37bdb7ec
rust: normalize `_for_unchecked_rev` naming among revlogs and the index
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52178
diff
changeset
|
386 self.inner.get_entry_for_unchecked_rev(rev) |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
387 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
388 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
389 /// Return the full data associated to a revision. |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
390 /// |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
391 /// All entries required to build the final data out of deltas will be |
52290
a3fa37bdb7ec
rust: normalize `_for_unchecked_rev` naming among revlogs and the index
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52178
diff
changeset
|
392 /// retrieved as needed, and the deltas will be applied to the initial |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
393 /// snapshot to rebuild the final data. |
52290
a3fa37bdb7ec
rust: normalize `_for_unchecked_rev` naming among revlogs and the index
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52178
diff
changeset
|
394 pub fn get_data_for_unchecked_rev( |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
395 &self, |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
396 rev: UncheckedRevision, |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
397 ) -> Result<Cow<[u8]>, RevlogError> { |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
398 if rev == NULL_REVISION.into() { |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
399 return Ok(Cow::Borrowed(&[])); |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
400 }; |
52290
a3fa37bdb7ec
rust: normalize `_for_unchecked_rev` naming among revlogs and the index
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52178
diff
changeset
|
401 self.get_entry_for_unchecked_rev(rev)?.data() |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
402 } |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
403 |
52290
a3fa37bdb7ec
rust: normalize `_for_unchecked_rev` naming among revlogs and the index
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52178
diff
changeset
|
404 /// [`Self::get_data_for_unchecked_rev`] for a checked [`Revision`]. |
a3fa37bdb7ec
rust: normalize `_for_unchecked_rev` naming among revlogs and the index
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52178
diff
changeset
|
405 pub fn get_data(&self, rev: Revision) -> Result<Cow<[u8]>, RevlogError> { |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
406 if rev == NULL_REVISION { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
407 return Ok(Cow::Borrowed(&[])); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
408 }; |
52290
a3fa37bdb7ec
rust: normalize `_for_unchecked_rev` naming among revlogs and the index
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52178
diff
changeset
|
409 self.get_entry(rev)?.data() |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
410 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
411 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
412 /// Check the hash of some given data against the recorded hash. |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
413 pub fn check_hash( |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
414 &self, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
415 p1: Revision, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
416 p2: Revision, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
417 expected: &[u8], |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
418 data: &[u8], |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
419 ) -> bool { |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
420 self.inner.check_hash(p1, p2, expected, data) |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
421 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
422 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
423 /// Build the full data of a revision out its snapshot |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
424 /// and its deltas. |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
425 fn build_data_from_deltas<T>( |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
426 buffer: &mut dyn RevisionBuffer<Target = T>, |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
427 snapshot: &[u8], |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
428 deltas: &[impl AsRef<[u8]>], |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
429 ) -> Result<(), RevlogError> { |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
430 if deltas.is_empty() { |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
431 buffer.extend_from_slice(snapshot); |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
432 return Ok(()); |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
433 } |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
434 let patches: Result<Vec<_>, _> = deltas |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
435 .iter() |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
436 .map(|d| patch::PatchList::new(d.as_ref())) |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
437 .collect(); |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
438 let patch = patch::fold_patch_lists(&patches?); |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
439 patch.apply(buffer, snapshot); |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
440 Ok(()) |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
441 } |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
442 } |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
443 |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
444 type IndexData = Box<dyn Deref<Target = [u8]> + Send + Sync>; |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
445 |
52177
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
446 /// TODO We should check for version 5.14+ at runtime, but we either should |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
447 /// add the `nix` dependency to get it efficiently, or vendor the code to read |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
448 /// both of which are overkill for such a feature. If we need this dependency |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
449 /// for more things later, we'll use it here too. |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
450 #[cfg(target_os = "linux")] |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
451 fn can_advise_populate_read() -> bool { |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
452 true |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
453 } |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
454 |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
455 #[cfg(not(target_os = "linux"))] |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
456 fn can_advise_populate_read() -> bool { |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
457 false |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
458 } |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
459 |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
460 /// Call `madvise` on the mmap with `MADV_POPULATE_READ` in a separate thread |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
461 /// to populate the mmap in the background for a small perf improvement. |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
462 #[cfg(target_os = "linux")] |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
463 fn advise_populate_read_mmap(mmap: &memmap2::Mmap) { |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
464 const MADV_POPULATE_READ: i32 = 22; |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
465 |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
466 // This is fine because the mmap is still referenced for at least |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
467 // the duration of this function, and the kernel will reject any wrong |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
468 // address. |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
469 let ptr = mmap.as_ptr() as u64; |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
470 let len = mmap.len(); |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
471 |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
472 // Fire and forget. The `JoinHandle` returned by `spawn` is dropped right |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
473 // after the call, the thread is thus detached. We don't care about success |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
474 // or failure here. |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
475 std::thread::spawn(move || unsafe { |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
476 // mmap's pointer is always page-aligned on Linux. In the case of |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
477 // file-based mmap (which is our use-case), the length should be |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
478 // correct. If not, it's not a safety concern as the kernel will just |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
479 // ignore unmapped pages and return ENOMEM, which we will promptly |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
480 // ignore, because we don't care about any errors. |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
481 libc::madvise(ptr as *mut libc::c_void, len, MADV_POPULATE_READ); |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
482 }); |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
483 } |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
484 |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
485 #[cfg(not(target_os = "linux"))] |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
486 fn advise_populate_read_mmap(mmap: &memmap2::Mmap) {} |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
487 |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
488 /// Open the revlog [`Index`] at `index_path`, through the `store_vfs` and the |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
489 /// given `options`. This controls whether (and how) we `mmap` the index file, |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
490 /// and returns an empty buffer if the index does not exist on disk. |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
491 /// This is only used when doing pure-Rust work, in Python contexts this is |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
492 /// unused at the time of writing. |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
493 pub fn open_index( |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
494 store_vfs: &impl Vfs, |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
495 index_path: &Path, |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
496 options: RevlogOpenOptions, |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
497 ) -> Result<Index, HgError> { |
52294
645d247d4c75
rust-vfs: rename `open` to `open_write` and `open_read` to `open`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52290
diff
changeset
|
498 let buf: IndexData = match store_vfs.open(index_path) { |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
499 Ok(mut file) => { |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
500 let mut buf = if let Some(threshold) = |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
501 options.data_config.mmap_index_threshold |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
502 { |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
503 let size = store_vfs.file_size(&file)?; |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
504 if size >= threshold { |
52165
84b5802ba7d3
rust: populate mmap by default if available
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52160
diff
changeset
|
505 // TODO madvise populate read in a background thread |
84b5802ba7d3
rust: populate mmap by default if available
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52160
diff
changeset
|
506 let mut mmap_options = MmapOptions::new(); |
52177
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
507 if !can_advise_populate_read() { |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
508 // Fall back to populating in the main thread if |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
509 // post-creation advice is not supported. |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
510 // Does nothing on platforms where it's not defined. |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
511 mmap_options.populate(); |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
512 } |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
513 // Safety is "enforced" by locks and assuming other |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
514 // processes are well-behaved. If any misbehaving or |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
515 // malicious process does touch the index, it could lead |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
516 // to corruption. This is somewhat inherent to file-based |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
517 // `mmap`, though some platforms have some ways of |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
518 // mitigating. |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
519 // TODO linux: set the immutable flag with `chattr(1)`? |
52165
84b5802ba7d3
rust: populate mmap by default if available
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52160
diff
changeset
|
520 let mmap = unsafe { mmap_options.map(&file) } |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
521 .when_reading_file(index_path)?; |
52177
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
522 |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
523 if can_advise_populate_read() { |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
524 advise_populate_read_mmap(&mmap); |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
525 } |
3d797007905d
rust: populate mmaps in a separate thread if possible
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52173
diff
changeset
|
526 |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
527 Some(Box::new(mmap) as IndexData) |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
528 } else { |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
529 None |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
530 } |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
531 } else { |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
532 None |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
533 }; |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
534 |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
535 if buf.is_none() { |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
536 let mut data = vec![]; |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
537 file.read_to_end(&mut data).when_reading_file(index_path)?; |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
538 buf = Some(Box::new(data) as IndexData); |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
539 } |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
540 buf.unwrap() |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
541 } |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
542 Err(err) => match err { |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
543 HgError::IoError { error, context } => match error.kind() { |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
544 ErrorKind::NotFound => Box::<Vec<u8>>::default(), |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
545 _ => return Err(HgError::IoError { error, context }), |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
546 }, |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
547 e => return Err(e), |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
548 }, |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
549 }; |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
550 |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
551 let index = Index::new(buf, options.index_header())?; |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
552 Ok(index) |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
553 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
554 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
555 /// The revlog entry's bytes and the necessary informations to extract |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
556 /// the entry's data. |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
557 #[derive(Clone)] |
50409
7ef51fff2c4f
rust-revlog: explicit naming for `RevlogEntry` lifetime
Georges Racinet <georges.racinet@octobus.net>
parents:
49937
diff
changeset
|
558 pub struct RevlogEntry<'revlog> { |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
559 revlog: &'revlog InnerRevlog, |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
560 rev: Revision, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
561 uncompressed_len: i32, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
562 p1: Revision, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
563 p2: Revision, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
564 flags: u16, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
565 hash: Node, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
566 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
567 |
50409
7ef51fff2c4f
rust-revlog: explicit naming for `RevlogEntry` lifetime
Georges Racinet <georges.racinet@octobus.net>
parents:
49937
diff
changeset
|
568 impl<'revlog> RevlogEntry<'revlog> { |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
569 pub fn revision(&self) -> Revision { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
570 self.rev |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
571 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
572 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
573 pub fn node(&self) -> &Node { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
574 &self.hash |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
575 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
576 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
577 pub fn uncompressed_len(&self) -> Option<u32> { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
578 u32::try_from(self.uncompressed_len).ok() |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
579 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
580 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
581 pub fn has_p1(&self) -> bool { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
582 self.p1 != NULL_REVISION |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
583 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
584 |
50410
c101e7757ed7
rust-revlog: fix lifetime problem for RevlogEntry parent entries accessors
Georges Racinet <georges.racinet@octobus.net>
parents:
50409
diff
changeset
|
585 pub fn p1_entry( |
c101e7757ed7
rust-revlog: fix lifetime problem for RevlogEntry parent entries accessors
Georges Racinet <georges.racinet@octobus.net>
parents:
50409
diff
changeset
|
586 &self, |
c101e7757ed7
rust-revlog: fix lifetime problem for RevlogEntry parent entries accessors
Georges Racinet <georges.racinet@octobus.net>
parents:
50409
diff
changeset
|
587 ) -> Result<Option<RevlogEntry<'revlog>>, RevlogError> { |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
588 if self.p1 == NULL_REVISION { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
589 Ok(None) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
590 } else { |
52290
a3fa37bdb7ec
rust: normalize `_for_unchecked_rev` naming among revlogs and the index
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52178
diff
changeset
|
591 Ok(Some(self.revlog.get_entry(self.p1)?)) |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
592 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
593 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
594 |
50410
c101e7757ed7
rust-revlog: fix lifetime problem for RevlogEntry parent entries accessors
Georges Racinet <georges.racinet@octobus.net>
parents:
50409
diff
changeset
|
595 pub fn p2_entry( |
c101e7757ed7
rust-revlog: fix lifetime problem for RevlogEntry parent entries accessors
Georges Racinet <georges.racinet@octobus.net>
parents:
50409
diff
changeset
|
596 &self, |
c101e7757ed7
rust-revlog: fix lifetime problem for RevlogEntry parent entries accessors
Georges Racinet <georges.racinet@octobus.net>
parents:
50409
diff
changeset
|
597 ) -> Result<Option<RevlogEntry<'revlog>>, RevlogError> { |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
598 if self.p2 == NULL_REVISION { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
599 Ok(None) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
600 } else { |
52290
a3fa37bdb7ec
rust: normalize `_for_unchecked_rev` naming among revlogs and the index
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52178
diff
changeset
|
601 Ok(Some(self.revlog.get_entry(self.p2)?)) |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
602 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
603 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
604 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
605 pub fn p1(&self) -> Option<Revision> { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
606 if self.p1 == NULL_REVISION { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
607 None |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
608 } else { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
609 Some(self.p1) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
610 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
611 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
612 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
613 pub fn p2(&self) -> Option<Revision> { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
614 if self.p2 == NULL_REVISION { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
615 None |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
616 } else { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
617 Some(self.p2) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
618 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
619 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
620 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
621 pub fn is_censored(&self) -> bool { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
622 (self.flags & REVISION_FLAG_CENSORED) != 0 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
623 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
624 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
625 pub fn has_length_affecting_flag_processor(&self) -> bool { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
626 // Relevant Python code: revlog.size() |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
627 // note: ELLIPSIS is known to not change the content |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
628 (self.flags & (REVIDX_KNOWN_FLAGS ^ REVISION_FLAG_ELLIPSIS)) != 0 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
629 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
630 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
631 /// The data for this entry, after resolving deltas if any. |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
632 /// Non-Python callers should probably call [`Self::data`] instead. |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
633 fn rawdata<G, T>( |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
634 &self, |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
635 stop_rev: Option<(Revision, &[u8])>, |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
636 with_buffer: G, |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
637 ) -> Result<(), RevlogError> |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
638 where |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
639 G: FnOnce( |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
640 usize, |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
641 &mut dyn FnMut( |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
642 &mut dyn RevisionBuffer<Target = T>, |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
643 ) -> Result<(), RevlogError>, |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
644 ) -> Result<(), RevlogError>, |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
645 { |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
646 let (delta_chain, stopped) = self |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
647 .revlog |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
648 .delta_chain(self.revision(), stop_rev.map(|(r, _)| r))?; |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
649 let target_size = |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
650 self.uncompressed_len().map(|raw_size| 4 * raw_size as u64); |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
651 |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
652 let deltas = self.revlog.chunks(delta_chain, target_size)?; |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
653 |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
654 let (base_text, deltas) = if stopped { |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
655 ( |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
656 stop_rev.as_ref().expect("last revision should be cached").1, |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
657 &deltas[..], |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
658 ) |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
659 } else { |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
660 let (buf, deltas) = deltas.split_at(1); |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
661 (buf[0].as_ref(), deltas) |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
662 }; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
663 |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
664 let size = self |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
665 .uncompressed_len() |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
666 .map(|l| l as usize) |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
667 .unwrap_or(base_text.len()); |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
668 with_buffer(size, &mut |buf| { |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
669 Revlog::build_data_from_deltas(buf, base_text, deltas)?; |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
670 Ok(()) |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
671 })?; |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
672 Ok(()) |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
673 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
674 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
675 fn check_data( |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
676 &self, |
50409
7ef51fff2c4f
rust-revlog: explicit naming for `RevlogEntry` lifetime
Georges Racinet <georges.racinet@octobus.net>
parents:
49937
diff
changeset
|
677 data: Cow<'revlog, [u8]>, |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
678 ) -> Result<Cow<'revlog, [u8]>, RevlogError> { |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
679 if self.revlog.check_hash( |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
680 self.p1, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
681 self.p2, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
682 self.hash.as_bytes(), |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
683 &data, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
684 ) { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
685 Ok(data) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
686 } else { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
687 if (self.flags & REVISION_FLAG_ELLIPSIS) != 0 { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
688 return Err(HgError::unsupported( |
52056
8b7123c8947b
update: add a Rust fast-path when updating from null (and clean)
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52041
diff
changeset
|
689 "support for ellipsis nodes is missing", |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
690 ) |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
691 .into()); |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
692 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
693 Err(corrupted(format!( |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
694 "hash check failed for revision {}", |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
695 self.rev |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
696 )) |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
697 .into()) |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
698 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
699 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
700 |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
701 pub fn data(&self) -> Result<Cow<'revlog, [u8]>, RevlogError> { |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
702 // TODO figure out if there is ever a need for `Cow` here anymore. |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
703 let mut data = CoreRevisionBuffer::new(); |
50743
124c44b5cfad
rust-revlog: fix RevlogEntry.data() for NULL_REVISION
Georges Racinet <georges.racinet@octobus.net>
parents:
50742
diff
changeset
|
704 if self.rev == NULL_REVISION { |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
705 return Ok(data.finish().into()); |
50743
124c44b5cfad
rust-revlog: fix RevlogEntry.data() for NULL_REVISION
Georges Racinet <georges.racinet@octobus.net>
parents:
50742
diff
changeset
|
706 } |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
707 self.rawdata(None, |size, f| { |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
708 // Pre-allocate the expected size (received from the index) |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
709 data.resize(size); |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
710 // Actually fill the buffer |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
711 f(&mut data)?; |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
712 Ok(()) |
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
713 })?; |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
714 if self.is_censored() { |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
715 return Err(HgError::CensoredNodeError.into()); |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
716 } |
52160
e01e84e5e426
rust-revlog: add a Rust-only `InnerRevlog`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52156
diff
changeset
|
717 self.check_data(data.finish().into()) |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
718 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
719 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
720 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
721 #[cfg(test)] |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
722 mod tests { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
723 use super::*; |
52178
bd8081e9fd62
rust: don't star export from the `revlog` module
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52177
diff
changeset
|
724 use crate::revlog::index::IndexEntryBuilder; |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
725 use itertools::Itertools; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
726 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
727 #[test] |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
728 fn test_empty() { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
729 let temp = tempfile::tempdir().unwrap(); |
52167
7be39c5110c9
hg-core: add a complete VFS
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52165
diff
changeset
|
730 let vfs = VfsImpl::new(temp.path().to_owned(), false); |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
731 std::fs::write(temp.path().join("foo.i"), b"").unwrap(); |
51863
69b804c8e09e
rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51862
diff
changeset
|
732 std::fs::write(temp.path().join("foo.d"), b"").unwrap(); |
51188
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51117
diff
changeset
|
733 let revlog = |
51863
69b804c8e09e
rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51862
diff
changeset
|
734 Revlog::open(&vfs, "foo.i", None, RevlogOpenOptions::default()) |
51188
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51117
diff
changeset
|
735 .unwrap(); |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
736 assert!(revlog.is_empty()); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
737 assert_eq!(revlog.len(), 0); |
52290
a3fa37bdb7ec
rust: normalize `_for_unchecked_rev` naming among revlogs and the index
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52178
diff
changeset
|
738 assert!(revlog.get_entry_for_unchecked_rev(0.into()).is_err()); |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
739 assert!(!revlog.has_rev(0.into())); |
50742
3338c6ffdaa3
rust-revlog: using constant in test
Georges Racinet <georges.racinet@octobus.net>
parents:
50741
diff
changeset
|
740 assert_eq!( |
3338c6ffdaa3
rust-revlog: using constant in test
Georges Racinet <georges.racinet@octobus.net>
parents:
50741
diff
changeset
|
741 revlog.rev_from_node(NULL_NODE.into()).unwrap(), |
3338c6ffdaa3
rust-revlog: using constant in test
Georges Racinet <georges.racinet@octobus.net>
parents:
50741
diff
changeset
|
742 NULL_REVISION |
3338c6ffdaa3
rust-revlog: using constant in test
Georges Racinet <georges.racinet@octobus.net>
parents:
50741
diff
changeset
|
743 ); |
52290
a3fa37bdb7ec
rust: normalize `_for_unchecked_rev` naming among revlogs and the index
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52178
diff
changeset
|
744 let null_entry = revlog |
a3fa37bdb7ec
rust: normalize `_for_unchecked_rev` naming among revlogs and the index
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52178
diff
changeset
|
745 .get_entry_for_unchecked_rev(NULL_REVISION.into()) |
a3fa37bdb7ec
rust: normalize `_for_unchecked_rev` naming among revlogs and the index
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52178
diff
changeset
|
746 .ok() |
a3fa37bdb7ec
rust: normalize `_for_unchecked_rev` naming among revlogs and the index
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52178
diff
changeset
|
747 .unwrap(); |
50743
124c44b5cfad
rust-revlog: fix RevlogEntry.data() for NULL_REVISION
Georges Racinet <georges.racinet@octobus.net>
parents:
50742
diff
changeset
|
748 assert_eq!(null_entry.revision(), NULL_REVISION); |
124c44b5cfad
rust-revlog: fix RevlogEntry.data() for NULL_REVISION
Georges Racinet <georges.racinet@octobus.net>
parents:
50742
diff
changeset
|
749 assert!(null_entry.data().unwrap().is_empty()); |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
750 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
751 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
752 #[test] |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
753 fn test_inline() { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
754 let temp = tempfile::tempdir().unwrap(); |
52167
7be39c5110c9
hg-core: add a complete VFS
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52165
diff
changeset
|
755 let vfs = VfsImpl::new(temp.path().to_owned(), false); |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
756 let node0 = Node::from_hex("2ed2a3912a0b24502043eae84ee4b279c18b90dd") |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
757 .unwrap(); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
758 let node1 = Node::from_hex("b004912a8510032a0350a74daa2803dadfb00e12") |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
759 .unwrap(); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
760 let node2 = Node::from_hex("dd6ad206e907be60927b5a3117b97dffb2590582") |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
761 .unwrap(); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
762 let entry0_bytes = IndexEntryBuilder::new() |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
763 .is_first(true) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
764 .with_version(1) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
765 .with_inline(true) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
766 .with_node(node0) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
767 .build(); |
51441
c3f2a9b55f59
rust-index: stop calling `with_offset` in the tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51253
diff
changeset
|
768 let entry1_bytes = IndexEntryBuilder::new().with_node(node1).build(); |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
769 let entry2_bytes = IndexEntryBuilder::new() |
50976
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
770 .with_p1(Revision(0)) |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
771 .with_p2(Revision(1)) |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
772 .with_node(node2) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
773 .build(); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
774 let contents = vec![entry0_bytes, entry1_bytes, entry2_bytes] |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
775 .into_iter() |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
776 .flatten() |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
777 .collect_vec(); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
778 std::fs::write(temp.path().join("foo.i"), contents).unwrap(); |
51188
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51117
diff
changeset
|
779 let revlog = |
51863
69b804c8e09e
rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51862
diff
changeset
|
780 Revlog::open(&vfs, "foo.i", None, RevlogOpenOptions::default()) |
51188
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51117
diff
changeset
|
781 .unwrap(); |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
782 |
52290
a3fa37bdb7ec
rust: normalize `_for_unchecked_rev` naming among revlogs and the index
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52178
diff
changeset
|
783 let entry0 = |
a3fa37bdb7ec
rust: normalize `_for_unchecked_rev` naming among revlogs and the index
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52178
diff
changeset
|
784 revlog.get_entry_for_unchecked_rev(0.into()).ok().unwrap(); |
50976
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
785 assert_eq!(entry0.revision(), Revision(0)); |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
786 assert_eq!(*entry0.node(), node0); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
787 assert!(!entry0.has_p1()); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
788 assert_eq!(entry0.p1(), None); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
789 assert_eq!(entry0.p2(), None); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
790 let p1_entry = entry0.p1_entry().unwrap(); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
791 assert!(p1_entry.is_none()); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
792 let p2_entry = entry0.p2_entry().unwrap(); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
793 assert!(p2_entry.is_none()); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
794 |
52290
a3fa37bdb7ec
rust: normalize `_for_unchecked_rev` naming among revlogs and the index
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52178
diff
changeset
|
795 let entry1 = |
a3fa37bdb7ec
rust: normalize `_for_unchecked_rev` naming among revlogs and the index
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52178
diff
changeset
|
796 revlog.get_entry_for_unchecked_rev(1.into()).ok().unwrap(); |
50976
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
797 assert_eq!(entry1.revision(), Revision(1)); |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
798 assert_eq!(*entry1.node(), node1); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
799 assert!(!entry1.has_p1()); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
800 assert_eq!(entry1.p1(), None); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
801 assert_eq!(entry1.p2(), None); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
802 let p1_entry = entry1.p1_entry().unwrap(); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
803 assert!(p1_entry.is_none()); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
804 let p2_entry = entry1.p2_entry().unwrap(); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
805 assert!(p2_entry.is_none()); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
806 |
52290
a3fa37bdb7ec
rust: normalize `_for_unchecked_rev` naming among revlogs and the index
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52178
diff
changeset
|
807 let entry2 = |
a3fa37bdb7ec
rust: normalize `_for_unchecked_rev` naming among revlogs and the index
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52178
diff
changeset
|
808 revlog.get_entry_for_unchecked_rev(2.into()).ok().unwrap(); |
50976
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
809 assert_eq!(entry2.revision(), Revision(2)); |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
810 assert_eq!(*entry2.node(), node2); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
811 assert!(entry2.has_p1()); |
50976
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
812 assert_eq!(entry2.p1(), Some(Revision(0))); |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
813 assert_eq!(entry2.p2(), Some(Revision(1))); |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
814 let p1_entry = entry2.p1_entry().unwrap(); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
815 assert!(p1_entry.is_some()); |
50976
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
816 assert_eq!(p1_entry.unwrap().revision(), Revision(0)); |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
817 let p2_entry = entry2.p2_entry().unwrap(); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
818 assert!(p2_entry.is_some()); |
50976
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
819 assert_eq!(p2_entry.unwrap().revision(), Revision(1)); |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
820 } |
50741
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
821 |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
822 #[test] |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
823 fn test_nodemap() { |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
824 let temp = tempfile::tempdir().unwrap(); |
52167
7be39c5110c9
hg-core: add a complete VFS
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52165
diff
changeset
|
825 let vfs = VfsImpl::new(temp.path().to_owned(), false); |
50741
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
826 |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
827 // building a revlog with a forced Node starting with zeros |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
828 // This is a corruption, but it does not preclude using the nodemap |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
829 // if we don't try and access the data |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
830 let node0 = Node::from_hex("00d2a3912a0b24502043eae84ee4b279c18b90dd") |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
831 .unwrap(); |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
832 let node1 = Node::from_hex("b004912a8510032a0350a74daa2803dadfb00e12") |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
833 .unwrap(); |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
834 let entry0_bytes = IndexEntryBuilder::new() |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
835 .is_first(true) |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
836 .with_version(1) |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
837 .with_inline(true) |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
838 .with_node(node0) |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
839 .build(); |
51441
c3f2a9b55f59
rust-index: stop calling `with_offset` in the tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
51253
diff
changeset
|
840 let entry1_bytes = IndexEntryBuilder::new().with_node(node1).build(); |
50741
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
841 let contents = vec![entry0_bytes, entry1_bytes] |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
842 .into_iter() |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
843 .flatten() |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
844 .collect_vec(); |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
845 std::fs::write(temp.path().join("foo.i"), contents).unwrap(); |
50983
eccf7dc7c91e
revlog: make the rust test for node hex prefix resolution exercise the nodemap
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50982
diff
changeset
|
846 |
eccf7dc7c91e
revlog: make the rust test for node hex prefix resolution exercise the nodemap
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50982
diff
changeset
|
847 let mut idx = nodemap::tests::TestNtIndex::new(); |
50990
12c308c55e53
branching: merge stable into default
Pierre-Yves David <pierre-yves.david@octobus.net>
diff
changeset
|
848 idx.insert_node(Revision(0), node0).unwrap(); |
12c308c55e53
branching: merge stable into default
Pierre-Yves David <pierre-yves.david@octobus.net>
diff
changeset
|
849 idx.insert_node(Revision(1), node1).unwrap(); |
50983
eccf7dc7c91e
revlog: make the rust test for node hex prefix resolution exercise the nodemap
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50982
diff
changeset
|
850 |
51188
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51117
diff
changeset
|
851 let revlog = Revlog::open_gen( |
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51117
diff
changeset
|
852 &vfs, |
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51117
diff
changeset
|
853 "foo.i", |
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51117
diff
changeset
|
854 None, |
51863
69b804c8e09e
rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51862
diff
changeset
|
855 RevlogOpenOptions::default(), |
51188
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51117
diff
changeset
|
856 Some(idx.nt), |
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51117
diff
changeset
|
857 ) |
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents:
51117
diff
changeset
|
858 .unwrap(); |
50741
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
859 |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
860 // accessing the data shows the corruption |
52290
a3fa37bdb7ec
rust: normalize `_for_unchecked_rev` naming among revlogs and the index
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52178
diff
changeset
|
861 revlog |
a3fa37bdb7ec
rust: normalize `_for_unchecked_rev` naming among revlogs and the index
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52178
diff
changeset
|
862 .get_entry_for_unchecked_rev(0.into()) |
a3fa37bdb7ec
rust: normalize `_for_unchecked_rev` naming among revlogs and the index
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52178
diff
changeset
|
863 .unwrap() |
a3fa37bdb7ec
rust: normalize `_for_unchecked_rev` naming among revlogs and the index
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52178
diff
changeset
|
864 .data() |
a3fa37bdb7ec
rust: normalize `_for_unchecked_rev` naming among revlogs and the index
Rapha?l Gom?s <rgomes@octobus.net>
parents:
52178
diff
changeset
|
865 .unwrap_err(); |
50741
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
866 |
50976
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
867 assert_eq!( |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
868 revlog.rev_from_node(NULL_NODE.into()).unwrap(), |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
869 Revision(-1) |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
870 ); |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
871 assert_eq!(revlog.rev_from_node(node0.into()).unwrap(), Revision(0)); |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
872 assert_eq!(revlog.rev_from_node(node1.into()).unwrap(), Revision(1)); |
50741
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
873 assert_eq!( |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
874 revlog |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
875 .rev_from_node(NodePrefix::from_hex("000").unwrap()) |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
876 .unwrap(), |
50976
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
877 Revision(-1) |
50741
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
878 ); |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
879 assert_eq!( |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
880 revlog |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
881 .rev_from_node(NodePrefix::from_hex("b00").unwrap()) |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
882 .unwrap(), |
50976
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
883 Revision(1) |
50741
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
884 ); |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
885 // RevlogError does not implement PartialEq |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
886 // (ultimately because io::Error does not) |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
887 match revlog |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
888 .rev_from_node(NodePrefix::from_hex("00").unwrap()) |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
889 .expect_err("Expected to give AmbiguousPrefix error") |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
890 { |
52343
393ad2685fb4
rust: make RevlogError AmbiguousPrefix case contain the actual prefix
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
52294
diff
changeset
|
891 RevlogError::AmbiguousPrefix(_) => (), |
50741
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
892 e => { |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
893 panic!("Got another error than AmbiguousPrefix: {:?}", e); |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
894 } |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
895 }; |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
896 } |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
897 } |