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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
db7dbe6f7bb2 rust: add Vfs trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51863
diff changeset
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
db7dbe6f7bb2 rust: add Vfs trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51863
diff changeset
278 // Todo use the `Vfs` trait here once we create a function for mmap
db7dbe6f7bb2 rust: add Vfs trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51863
diff changeset
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
db7dbe6f7bb2 rust: add Vfs trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51863
diff changeset
292 // Todo use the `Vfs` trait here once we create a function for mmap
db7dbe6f7bb2 rust: add Vfs trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51863
diff changeset
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>
parents: 50976 50983
diff changeset
848 idx.insert_node(Revision(0), node0).unwrap();
12c308c55e53 branching: merge stable into default
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50976 50983
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 }