annotate rust/hg-core/src/revlog/mod.rs @ 51864:db7dbe6f7bb2

rust: add Vfs trait This will allow for the use of multiple vfs like in the Python implementation, as well as hiding the details of the upcoming Python vfs wrapper to hg-core.
author Rapha?l Gom?s <rgomes@octobus.net>
date Wed, 19 Jun 2024 14:49:35 +0200
parents 69b804c8e09e
children 652149ed64f0
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;
46431
645ee7225fab rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents: 46428
diff changeset
12 pub use node::{FromHexError, Node, NodePrefix};
45532
c2317b7624fd hg-core: add `Changlog` a specialized `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
13 pub mod changelog;
47961
4d2a5ca060e3 rust: Add a Filelog struct that wraps Revlog
Simon Sapin <simon.sapin@octobus.net>
parents: 46821
diff changeset
14 pub mod filelog;
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents: 44973
diff changeset
15 pub mod index;
45533
89ac95bd4993 hg-core: add `Manifest` a specialized `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45532
diff changeset
16 pub mod manifest;
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents: 44973
diff changeset
17 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
18
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
19 use std::borrow::Cow;
51861
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
20 use std::collections::HashSet;
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
21 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
22 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
23 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
24
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
25 use flate2::read::ZlibDecoder;
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
26 use sha1::{Digest, Sha1};
50503
74d8a1b03960 rust: speed up zstd decompression by re-using the decompression context
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50410
diff changeset
27 use std::cell::RefCell;
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
28 use zstd;
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
29
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
30 use self::node::{NODE_BYTES_LENGTH, NULL_NODE};
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
31 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
32 use super::index::Index;
51442
d2858d97af6c rust-index: drop offset_override
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51441
diff changeset
33 use super::index::INDEX_ENTRY_SIZE;
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
34 use super::nodemap::{NodeMap, NodeMapError};
51861
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
35 use crate::config::{Config, ResourceProfileValue};
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
36 use crate::errors::HgError;
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;
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
38 use crate::requirements::{
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
39 GENERALDELTA_REQUIREMENT, NARROW_REQUIREMENT, SPARSEREVLOG_REQUIREMENT,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
40 };
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
51616
b08c5fbe0e70 rust: blanket implementation of Graph for Graph references
Georges Racinet <georges.racinet@octobus.net>
parents: 51253
diff changeset
142 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
143 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
144 (*self).parents(rev)
b08c5fbe0e70 rust: blanket implementation of Graph for Graph references
Georges Racinet <georges.racinet@octobus.net>
parents: 51253
diff changeset
145 }
b08c5fbe0e70 rust: blanket implementation of Graph for Graph references
Georges Racinet <georges.racinet@octobus.net>
parents: 51253
diff changeset
146 }
b08c5fbe0e70 rust: blanket implementation of Graph for Graph references
Georges Racinet <georges.racinet@octobus.net>
parents: 51253
diff changeset
147
44181
3fb39dc2e356 rust-revlog: a trait for the revlog index
Georges Racinet <georges.racinet@octobus.net>
parents: 44143
diff changeset
148 /// The Mercurial Revlog Index
3fb39dc2e356 rust-revlog: a trait for the revlog index
Georges Racinet <georges.racinet@octobus.net>
parents: 44143
diff changeset
149 ///
3fb39dc2e356 rust-revlog: a trait for the revlog index
Georges Racinet <georges.racinet@octobus.net>
parents: 44143
diff changeset
150 /// 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
151 /// 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
152 pub trait RevlogIndex {
3fb39dc2e356 rust-revlog: a trait for the revlog index
Georges Racinet <georges.racinet@octobus.net>
parents: 44143
diff changeset
153 /// 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
154 fn len(&self) -> usize;
3fb39dc2e356 rust-revlog: a trait for the revlog index
Georges Racinet <georges.racinet@octobus.net>
parents: 44143
diff changeset
155
44973
26114bd6ec60 rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44182
diff changeset
156 fn is_empty(&self) -> bool {
26114bd6ec60 rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44182
diff changeset
157 self.len() == 0
26114bd6ec60 rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44182
diff changeset
158 }
26114bd6ec60 rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents: 44182
diff changeset
159
50974
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
160 /// 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
161 fn node(&self, rev: Revision) -> Option<&Node>;
50971
c950fdba7472 rust: add `UncheckedRevision` type
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50743
diff changeset
162
c950fdba7472 rust: add `UncheckedRevision` type
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50743
diff changeset
163 /// 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
164 /// 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
165 ///
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
166 /// [`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
167 #[inline(always)]
50971
c950fdba7472 rust: add `UncheckedRevision` type
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50743
diff changeset
168 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
169 let rev = rev.0;
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
170
50976
4c5f6e95df84 rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50975
diff changeset
171 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
172 {
4c5f6e95df84 rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50975
diff changeset
173 Some(Revision(rev))
50971
c950fdba7472 rust: add `UncheckedRevision` type
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50743
diff changeset
174 } else {
c950fdba7472 rust: add `UncheckedRevision` type
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50743
diff changeset
175 None
c950fdba7472 rust: add `UncheckedRevision` type
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50743
diff changeset
176 }
c950fdba7472 rust: add `UncheckedRevision` type
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50743
diff changeset
177 }
44181
3fb39dc2e356 rust-revlog: a trait for the revlog index
Georges Racinet <georges.racinet@octobus.net>
parents: 44143
diff changeset
178 }
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
179
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
180 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
181 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
182 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
183 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
184
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
185 // 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
186 // 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
187 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
188 | REVISION_FLAG_ELLIPSIS
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
189 | REVISION_FLAG_EXTSTORED
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
190 | REVISION_FLAG_HASCOPIESINFO;
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
191
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
192 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
193
50974
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
194 #[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
195 pub enum RevlogError {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
196 InvalidRevision,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
197 /// 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
198 WDirUnsupported,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
199 /// Found more than one entry whose ID match the requested prefix
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
200 AmbiguousPrefix,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
201 #[from]
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
202 Other(HgError),
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
203 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
204
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
205 impl From<NodeMapError> for RevlogError {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
206 fn from(error: NodeMapError) -> Self {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
207 match error {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
208 NodeMapError::MultipleResults => RevlogError::AmbiguousPrefix,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
209 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
210 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
211 ),
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
212 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
213 }
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
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
216 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
217 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
218 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
219
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
220 impl RevlogError {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
221 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
222 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
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
51863
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
226 #[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
227 pub enum RevlogType {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
228 Changelog,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
229 Manifestlog,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
230 Filelog,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
231 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
232
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
233 impl TryFrom<usize> for RevlogType {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
234 type Error = HgError;
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
235
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
236 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
237 match value {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
238 1001 => Ok(Self::Changelog),
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
239 1002 => Ok(Self::Manifestlog),
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
240 1003 => Ok(Self::Filelog),
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
241 t => Err(HgError::abort(
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
242 format!("Unknown revlog type {}", t),
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
243 exit_codes::ABORT,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
244 None,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
245 )),
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 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
248 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
249
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
250 #[derive(Debug, Copy, Clone, PartialEq, Eq)]
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
251 pub enum CompressionEngine {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
252 Zlib {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
253 /// Between 0 and 9 included
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
254 level: u32,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
255 },
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
256 Zstd {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
257 /// Between 0 and 22 included
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
258 level: u32,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
259 /// Never used in practice for now
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
260 threads: u32,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
261 },
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
262 /// No compression is performed
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
263 None,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
264 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
265 impl CompressionEngine {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
266 pub fn set_level(&mut self, new_level: usize) -> Result<(), HgError> {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
267 match self {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
268 CompressionEngine::Zlib { level } => {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
269 if new_level > 9 {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
270 return Err(HgError::abort(
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
271 format!(
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
272 "invalid compression zlib compression level {}",
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
273 new_level
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
274 ),
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
275 exit_codes::ABORT,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
276 None,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
277 ));
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
278 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
279 *level = new_level as u32;
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
280 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
281 CompressionEngine::Zstd { level, .. } => {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
282 if new_level > 22 {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
283 return Err(HgError::abort(
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
284 format!(
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
285 "invalid compression zstd compression level {}",
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
286 new_level
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
287 ),
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
288 exit_codes::ABORT,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
289 None,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
290 ));
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
291 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
292 *level = new_level as u32;
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
293 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
294 CompressionEngine::None => {}
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
295 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
296 Ok(())
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
297 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
298
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
299 pub fn zstd(
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
300 zstd_level: Option<u32>,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
301 ) -> Result<CompressionEngine, HgError> {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
302 let mut engine = CompressionEngine::Zstd {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
303 level: 3,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
304 threads: 0,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
305 };
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
306 if let Some(level) = zstd_level {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
307 engine.set_level(level as usize)?;
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
308 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
309 Ok(engine)
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
310 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
311 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
312
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
313 impl Default for CompressionEngine {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
314 fn default() -> Self {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
315 Self::Zlib { level: 6 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
316 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
317 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
318
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
319 #[derive(Debug, Clone, Copy, PartialEq)]
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
320 /// Holds configuration values about how the revlog data is read
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
321 pub struct RevlogDataConfig {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
322 /// Should we try to open the "pending" version of the revlog
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
323 pub try_pending: bool,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
324 /// Should we try to open the "split" version of the revlog
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
325 pub try_split: bool,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
326 /// When True, `indexfile` should be opened with `checkambig=True` at
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
327 /// writing time, to avoid file stat ambiguity
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
328 pub check_ambig: bool,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
329 /// If true, use mmap instead of reading to deal with large indexes
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
330 pub mmap_large_index: bool,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
331 /// How much data is considered large
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
332 pub mmap_index_threshold: Option<u64>,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
333 /// How much data to read and cache into the raw revlog data cache
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
334 pub chunk_cache_size: u64,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
335 /// The size of the uncompressed cache compared to the largest revision
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
336 /// seen
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
337 pub uncompressed_cache_factor: Option<f64>,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
338 /// The number of chunks cached
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
339 pub uncompressed_cache_count: Option<u64>,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
340 /// Allow sparse reading of the revlog data
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
341 pub with_sparse_read: bool,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
342 /// Minimal density of a sparse read chunk
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
343 pub sr_density_threshold: f64,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
344 /// Minimal size of the data we skip when performing sparse reads
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
345 pub sr_min_gap_size: u64,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
346 /// Whether deltas are encoded against arbitrary bases
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
347 pub general_delta: bool,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
348 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
349
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
350 impl RevlogDataConfig {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
351 pub fn new(
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
352 config: &Config,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
353 requirements: &HashSet<String>,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
354 ) -> Result<Self, HgError> {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
355 let mut data_config = Self::default();
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
356 if let Some(chunk_cache_size) =
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
357 config.get_byte_size(b"format", b"chunkcachesize")?
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
358 {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
359 data_config.chunk_cache_size = chunk_cache_size;
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
360 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
361
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
362 let memory_profile = config.get_resource_profile(Some("memory"));
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
363 if memory_profile.value >= ResourceProfileValue::Medium {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
364 data_config.uncompressed_cache_count = Some(10_000);
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
365 data_config.uncompressed_cache_factor = Some(4.0);
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
366 if memory_profile.value >= ResourceProfileValue::High {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
367 data_config.uncompressed_cache_factor = Some(10.0)
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
368 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
369 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
370
51863
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
371 if let Some(mmap_index_threshold) = config
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
372 .get_byte_size(b"storage", b"revlog.mmap.index:size-threshold")?
51861
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
373 {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
374 data_config.mmap_index_threshold = Some(mmap_index_threshold);
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
375 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
376
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
377 let with_sparse_read =
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
378 config.get_bool(b"experimental", b"sparse-read")?;
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
379 if let Some(sr_density_threshold) = config
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
380 .get_f64(b"experimental", b"sparse-read.density-threshold")?
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
381 {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
382 data_config.sr_density_threshold = sr_density_threshold;
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
383 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
384 data_config.with_sparse_read = with_sparse_read;
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
385 if let Some(sr_min_gap_size) = config
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
386 .get_byte_size(b"experimental", b"sparse-read.min-gap-size")?
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
387 {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
388 data_config.sr_min_gap_size = sr_min_gap_size;
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
389 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
390
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
391 data_config.with_sparse_read =
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
392 requirements.contains(SPARSEREVLOG_REQUIREMENT);
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
393
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
394 Ok(data_config)
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
395 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
396 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
397
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
398 impl Default for RevlogDataConfig {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
399 fn default() -> Self {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
400 Self {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
401 chunk_cache_size: 65536,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
402 sr_density_threshold: 0.50,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
403 sr_min_gap_size: 262144,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
404 try_pending: Default::default(),
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
405 try_split: Default::default(),
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
406 check_ambig: Default::default(),
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
407 mmap_large_index: Default::default(),
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
408 mmap_index_threshold: Default::default(),
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
409 uncompressed_cache_factor: Default::default(),
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
410 uncompressed_cache_count: Default::default(),
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
411 with_sparse_read: Default::default(),
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
412 general_delta: Default::default(),
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
413 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
414 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
415 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
416
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
417 #[derive(Debug, Clone, Copy, PartialEq)]
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
418 /// Holds configuration values about how new deltas are computed.
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
419 ///
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
420 /// Some attributes are duplicated from [`RevlogDataConfig`] to help having
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
421 /// each object self contained.
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
422 pub struct RevlogDeltaConfig {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
423 /// Whether deltas can be encoded against arbitrary bases
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
424 pub general_delta: bool,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
425 /// Allow sparse writing of the revlog data
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
426 pub sparse_revlog: bool,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
427 /// Maximum length of a delta chain
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
428 pub max_chain_len: Option<u64>,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
429 /// Maximum distance between a delta chain's start and end
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
430 pub max_deltachain_span: Option<u64>,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
431 /// If `upper_bound_comp` is not None, this is the expected maximal
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
432 /// gain from compression for the data content
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
433 pub upper_bound_comp: Option<f64>,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
434 /// Should we try a delta against both parents
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
435 pub delta_both_parents: bool,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
436 /// Test delta base candidate groups by chunks of this maximal size
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
437 pub candidate_group_chunk_size: u64,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
438 /// Should we display debug information about delta computation
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
439 pub debug_delta: bool,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
440 /// Trust incoming deltas by default
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
441 pub lazy_delta: bool,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
442 /// Trust the base of incoming deltas by default
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
443 pub lazy_delta_base: bool,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
444 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
445 impl RevlogDeltaConfig {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
446 pub fn new(
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
447 config: &Config,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
448 requirements: &HashSet<String>,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
449 revlog_type: RevlogType,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
450 ) -> Result<Self, HgError> {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
451 let mut delta_config = Self {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
452 delta_both_parents: config
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
453 .get_option_no_default(
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
454 b"storage",
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
455 b"revlog.optimize-delta-parent-choice",
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
456 )?
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
457 .unwrap_or(true),
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
458 candidate_group_chunk_size: config
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
459 .get_u64(
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
460 b"storage",
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
461 b"revlog.delta-parent-search.candidate-group-chunk-size",
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
462 )?
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
463 .unwrap_or_default(),
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
464 ..Default::default()
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
465 };
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
466
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
467 delta_config.debug_delta =
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
468 config.get_bool(b"debug", b"revlog.debug-delta")?;
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
469
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
470 delta_config.general_delta =
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
471 requirements.contains(GENERALDELTA_REQUIREMENT);
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
472
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
473 let lazy_delta =
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
474 config.get_bool(b"storage", b"revlog.reuse-external-delta")?;
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
475
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
476 if revlog_type == RevlogType::Manifestlog {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
477 // upper bound of what we expect from compression
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
478 // (real life value seems to be 3)
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
479 delta_config.upper_bound_comp = Some(3.0)
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
480 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
481
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
482 let mut lazy_delta_base = false;
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
483 if lazy_delta {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
484 lazy_delta_base = match config.get_option_no_default(
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
485 b"storage",
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
486 b"revlog.reuse-external-delta-parent",
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
487 )? {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
488 Some(base) => base,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
489 None => config.get_bool(b"format", b"generaldelta")?,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
490 };
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
491 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
492 delta_config.lazy_delta = lazy_delta;
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
493 delta_config.lazy_delta_base = lazy_delta_base;
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
494
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
495 delta_config.max_deltachain_span =
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
496 match config.get_i64(b"experimental", b"maxdeltachainspan")? {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
497 Some(span) => {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
498 if span < 0 {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
499 None
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
500 } else {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
501 Some(span as u64)
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
502 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
503 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
504 None => None,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
505 };
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
506
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
507 delta_config.sparse_revlog =
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
508 requirements.contains(SPARSEREVLOG_REQUIREMENT);
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
509
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
510 delta_config.max_chain_len =
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
511 config.get_byte_size_no_default(b"format", b"maxchainlen")?;
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
512
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
513 Ok(delta_config)
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
514 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
515 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
516
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
517 impl Default for RevlogDeltaConfig {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
518 fn default() -> Self {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
519 Self {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
520 delta_both_parents: true,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
521 lazy_delta: true,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
522 general_delta: Default::default(),
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
523 sparse_revlog: Default::default(),
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
524 max_chain_len: Default::default(),
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
525 max_deltachain_span: Default::default(),
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
526 upper_bound_comp: Default::default(),
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
527 candidate_group_chunk_size: Default::default(),
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
528 debug_delta: Default::default(),
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
529 lazy_delta_base: Default::default(),
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
530 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
531 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
532 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
533
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
534 #[derive(Debug, Default, Clone, Copy, PartialEq)]
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
535 /// Holds configuration values about the available revlog features
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
536 pub struct RevlogFeatureConfig {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
537 /// The compression engine and its options
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
538 pub compression_engine: CompressionEngine,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
539 /// Can we use censor on this revlog
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
540 pub censorable: bool,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
541 /// Does this revlog use the "side data" feature
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
542 pub has_side_data: bool,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
543 /// Might remove this configuration once the rank computation has no
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
544 /// impact
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
545 pub compute_rank: bool,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
546 /// Parent order is supposed to be semantically irrelevant, so we
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
547 /// normally re-sort parents to ensure that the first parent is non-null,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
548 /// if there is a non-null parent at all.
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
549 /// filelog abuses the parent order as a flag to mark some instances of
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
550 /// meta-encoded files, so allow it to disable this behavior.
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
551 pub canonical_parent_order: bool,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
552 /// Can ellipsis commit be used
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
553 pub enable_ellipsis: bool,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
554 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
555 impl RevlogFeatureConfig {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
556 pub fn new(
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
557 config: &Config,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
558 requirements: &HashSet<String>,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
559 ) -> Result<Self, HgError> {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
560 let mut feature_config = Self::default();
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
561
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
562 let zlib_level = config.get_u32(b"storage", b"revlog.zlib.level")?;
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
563 let zstd_level = config.get_u32(b"storage", b"revlog.zstd.level")?;
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
564
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
565 feature_config.compression_engine = CompressionEngine::default();
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
566
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
567 for requirement in requirements {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
568 if requirement.starts_with("revlog-compression-")
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
569 || requirement.starts_with("exp-compression-")
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
570 {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
571 let split = &mut requirement.splitn(3, '-');
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
572 split.next();
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
573 split.next();
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
574 feature_config.compression_engine = match split.next().unwrap()
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
575 {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
576 "zstd" => CompressionEngine::zstd(zstd_level)?,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
577 e => {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
578 return Err(HgError::UnsupportedFeature(format!(
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
579 "Unsupported compression engine '{e}'"
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
580 )))
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
581 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
582 };
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
583 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
584 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
585 if let Some(level) = zlib_level {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
586 if matches!(
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
587 feature_config.compression_engine,
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
588 CompressionEngine::Zlib { .. }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
589 ) {
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
590 feature_config
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
591 .compression_engine
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
592 .set_level(level as usize)?;
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
593 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
594 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
595
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
596 feature_config.enable_ellipsis =
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
597 requirements.contains(NARROW_REQUIREMENT);
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
598
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
599 Ok(feature_config)
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
600 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
601 }
0604673428b7 rust-revlog: add revlog-specific config objects
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51620
diff changeset
602
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
603 /// Read only implementation of revlog.
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
604 pub struct Revlog {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
605 /// When index and data are not interleaved: bytes of the revlog index.
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
606 /// When index and data are interleaved: bytes of the revlog index and
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
607 /// data.
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
608 index: Index,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
609 /// When index and data are not interleaved: bytes of the revlog data
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
610 data_bytes: Option<Box<dyn Deref<Target = [u8]> + Send>>,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
611 /// 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
612 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
613 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
614
50975
27e773aa607d rust: implement the `Graph` trait for all revlogs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50974
diff changeset
615 impl Graph for Revlog {
27e773aa607d rust: implement the `Graph` trait for all revlogs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50974
diff changeset
616 fn parents(&self, rev: Revision) -> Result<[Revision; 2], GraphError> {
27e773aa607d rust: implement the `Graph` trait for all revlogs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50974
diff changeset
617 self.index.parents(rev)
27e773aa607d rust: implement the `Graph` trait for all revlogs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50974
diff changeset
618 }
27e773aa607d rust: implement the `Graph` trait for all revlogs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50974
diff changeset
619 }
27e773aa607d rust: implement the `Graph` trait for all revlogs
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50974
diff changeset
620
51863
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
621 #[derive(Debug, Copy, Clone, PartialEq)]
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
622 pub enum RevlogVersionOptions {
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
623 V0,
51863
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
624 V1 { general_delta: bool, inline: bool },
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
625 V2,
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
626 ChangelogV2 { compute_rank: bool },
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
627 }
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
628
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
629 /// Options to govern how a revlog should be opened, usually from the
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
630 /// repository configuration or requirements.
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
631 #[derive(Debug, Copy, Clone)]
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
632 pub struct RevlogOpenOptions {
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
633 /// The revlog version, along with any option specific to this version
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
634 pub version: RevlogVersionOptions,
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
635 /// Whether the revlog uses a persistent nodemap.
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
636 pub use_nodemap: bool,
51863
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
637 pub delta_config: RevlogDeltaConfig,
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
638 pub data_config: RevlogDataConfig,
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
639 pub feature_config: RevlogFeatureConfig,
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
640 }
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
641
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
642 #[cfg(test)]
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
643 impl Default for RevlogOpenOptions {
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
644 fn default() -> Self {
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
645 Self {
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
646 version: RevlogVersionOptions::V1 {
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
647 general_delta: true,
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
648 inline: false,
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
649 },
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
650 use_nodemap: true,
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
651 data_config: Default::default(),
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
652 delta_config: Default::default(),
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
653 feature_config: Default::default(),
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
654 }
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
655 }
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
656 }
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
657
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
658 impl RevlogOpenOptions {
51863
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
659 pub fn new(
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
660 inline: bool,
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
661 data_config: RevlogDataConfig,
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
662 delta_config: RevlogDeltaConfig,
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
663 feature_config: RevlogFeatureConfig,
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
664 ) -> Self {
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
665 Self {
51863
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
666 version: RevlogVersionOptions::V1 {
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
667 general_delta: data_config.general_delta,
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
668 inline,
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
669 },
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
670 use_nodemap: false,
51863
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
671 data_config,
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
672 delta_config,
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
673 feature_config,
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
674 }
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
675 }
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
676
51863
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
677 pub fn index_header(&self) -> index::IndexHeader {
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
678 index::IndexHeader {
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
679 header_bytes: match self.version {
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
680 RevlogVersionOptions::V0 => [0, 0, 0, 0],
51863
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
681 RevlogVersionOptions::V1 {
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
682 general_delta,
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
683 inline,
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
684 } => [
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
685 0,
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
686 if general_delta && inline {
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
687 3
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
688 } else if general_delta {
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
689 2
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
690 } else {
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
691 u8::from(inline)
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
692 },
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
693 0,
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
694 1,
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
695 ],
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
696 RevlogVersionOptions::V2 => 0xDEADu32.to_be_bytes(),
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
697 RevlogVersionOptions::ChangelogV2 { compute_rank: _ } => {
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
698 0xD34Du32.to_be_bytes()
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
699 }
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
700 },
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
701 }
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
702 }
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
703 }
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
704
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
705 impl Revlog {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
706 /// 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
707 ///
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
708 /// 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
709 /// interleaved.
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
710 pub fn open(
51864
db7dbe6f7bb2 rust: add Vfs trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51863
diff changeset
711 // 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
712 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
713 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
714 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
715 options: RevlogOpenOptions,
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
716 ) -> 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
717 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
718 }
eccf7dc7c91e revlog: make the rust test for node hex prefix resolution exercise the nodemap
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50982
diff changeset
719
eccf7dc7c91e revlog: make the rust test for node hex prefix resolution exercise the nodemap
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50982
diff changeset
720 fn open_gen(
51864
db7dbe6f7bb2 rust: add Vfs trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51863
diff changeset
721 // 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
722 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
723 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
724 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
725 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
726 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
727 ) -> 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
728 let index_path = index_path.as_ref();
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
729 let index = {
51117
532e74ad3ff6 rust: run a clippy pass with the latest stable version
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50990
diff changeset
730 match store_vfs.mmap_open_opt(index_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
731 None => Index::new(
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
732 Box::<Vec<_>>::default(),
51863
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
733 options.index_header(),
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
734 ),
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
735 Some(index_mmap) => {
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
736 let index = Index::new(
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
737 Box::new(index_mmap),
51863
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
738 options.index_header(),
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
739 )?;
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
740 Ok(index)
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
741 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
742 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
743 }?;
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
744
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
745 let default_data_path = index_path.with_extension("d");
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
746
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
747 // type annotation required
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
748 // won't recognize Mmap as Deref<Target = [u8]>
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
749 let data_bytes: Option<Box<dyn Deref<Target = [u8]> + Send>> =
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
750 if index.is_inline() {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
751 None
51862
09ece563609a rust-revlog: don't try to open the data file if the index is empty
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51861
diff changeset
752 } else if index.is_empty() {
09ece563609a rust-revlog: don't try to open the data file if the index is empty
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51861
diff changeset
753 // No need to even try to open the data file then.
09ece563609a rust-revlog: don't try to open the data file if the index is empty
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51861
diff changeset
754 Some(Box::new(&[][..]))
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
755 } else {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
756 let data_path = data_path.unwrap_or(&default_data_path);
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
757 let data_mmap = store_vfs.mmap_open(data_path)?;
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
758 Some(Box::new(data_mmap))
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
759 };
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
760
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
761 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
762 None
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
763 } else {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
764 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
765 |(docket, data)| {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
766 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
767 Box::new(data),
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
768 docket.data_length,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
769 )
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
770 },
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
771 )
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
772 };
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
773
50983
eccf7dc7c91e revlog: make the rust test for node hex prefix resolution exercise the nodemap
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50982
diff changeset
774 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
775
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
776 Ok(Revlog {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
777 index,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
778 data_bytes,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
779 nodemap,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
780 })
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
781 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
782
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
783 /// 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
784 pub fn len(&self) -> usize {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
785 self.index.len()
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
786 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
787
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
788 /// 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
789 pub fn is_empty(&self) -> bool {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
790 self.index.is_empty()
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
791 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
792
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
793 /// 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
794 /// revlog
50974
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
795 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
796 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
797 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
798 }
50974
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
799 let rev = self.index.check_revision(rev)?;
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
800 Some(self.index.get_entry(rev)?.hash())
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
801 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
802
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
803 /// 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
804 /// revlog
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
805 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
806 &self,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
807 node: NodePrefix,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
808 ) -> 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
809 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
810 nodemap
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
811 .find_bin(&self.index, node)?
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
812 .ok_or(RevlogError::InvalidRevision)
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
813 } else {
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
814 self.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
815 }
50740
0159b014f3ab rust-revlog: split out method for `rev_from_node` without persistent nodemap
Georges Racinet <georges.racinet@octobus.net>
parents: 50505
diff changeset
816 }
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
817
50740
0159b014f3ab rust-revlog: split out method for `rev_from_node` without persistent nodemap
Georges Racinet <georges.racinet@octobus.net>
parents: 50505
diff changeset
818 /// Same as `rev_from_node`, without using a persistent nodemap
0159b014f3ab rust-revlog: split out method for `rev_from_node` without persistent nodemap
Georges Racinet <georges.racinet@octobus.net>
parents: 50505
diff changeset
819 ///
0159b014f3ab rust-revlog: split out method for `rev_from_node` without persistent nodemap
Georges Racinet <georges.racinet@octobus.net>
parents: 50505
diff changeset
820 /// This is used as fallback when a persistent nodemap is not present.
0159b014f3ab rust-revlog: split out method for `rev_from_node` without persistent nodemap
Georges Racinet <georges.racinet@octobus.net>
parents: 50505
diff changeset
821 /// This happens when the persistent-nodemap experimental feature is not
0159b014f3ab rust-revlog: split out method for `rev_from_node` without persistent nodemap
Georges Racinet <georges.racinet@octobus.net>
parents: 50505
diff changeset
822 /// enabled, or for small revlogs.
0159b014f3ab rust-revlog: split out method for `rev_from_node` without persistent nodemap
Georges Racinet <georges.racinet@octobus.net>
parents: 50505
diff changeset
823 fn rev_from_node_no_persistent_nodemap(
0159b014f3ab rust-revlog: split out method for `rev_from_node` without persistent nodemap
Georges Racinet <georges.racinet@octobus.net>
parents: 50505
diff changeset
824 &self,
0159b014f3ab rust-revlog: split out method for `rev_from_node` without persistent nodemap
Georges Racinet <georges.racinet@octobus.net>
parents: 50505
diff changeset
825 node: NodePrefix,
0159b014f3ab rust-revlog: split out method for `rev_from_node` without persistent nodemap
Georges Racinet <georges.racinet@octobus.net>
parents: 50505
diff changeset
826 ) -> Result<Revision, RevlogError> {
0159b014f3ab rust-revlog: split out method for `rev_from_node` without persistent nodemap
Georges Racinet <georges.racinet@octobus.net>
parents: 50505
diff changeset
827 // Linear scan of the revlog
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
828 // TODO: consider building a non-persistent nodemap in memory to
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
829 // optimize these cases.
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
830 let mut found_by_prefix = None;
50990
12c308c55e53 branching: merge stable into default
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50976 50983
diff changeset
831 for rev in (-1..self.len() as BaseRevision).rev() {
50976
4c5f6e95df84 rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50975
diff changeset
832 let rev = Revision(rev as BaseRevision);
50990
12c308c55e53 branching: merge stable into default
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 50976 50983
diff changeset
833 let candidate_node = if rev == Revision(-1) {
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
834 NULL_NODE
363620b934aa revlog: fix a bug where NULL_NODE failed to be resolved to NULL_REV
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50743
diff changeset
835 } else {
363620b934aa revlog: fix a bug where NULL_NODE failed to be resolved to NULL_REV
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50743
diff changeset
836 let index_entry =
363620b934aa revlog: fix a bug where NULL_NODE failed to be resolved to NULL_REV
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50743
diff changeset
837 self.index.get_entry(rev).ok_or_else(|| {
363620b934aa revlog: fix a bug where NULL_NODE failed to be resolved to NULL_REV
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50743
diff changeset
838 HgError::corrupted(
363620b934aa revlog: fix a bug where NULL_NODE failed to be resolved to NULL_REV
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50743
diff changeset
839 "revlog references a revision not in the index",
363620b934aa revlog: fix a bug where NULL_NODE failed to be resolved to NULL_REV
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50743
diff changeset
840 )
363620b934aa revlog: fix a bug where NULL_NODE failed to be resolved to NULL_REV
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50743
diff changeset
841 })?;
363620b934aa revlog: fix a bug where NULL_NODE failed to be resolved to NULL_REV
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50743
diff changeset
842 *index_entry.hash()
363620b934aa revlog: fix a bug where NULL_NODE failed to be resolved to NULL_REV
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50743
diff changeset
843 };
363620b934aa revlog: fix a bug where NULL_NODE failed to be resolved to NULL_REV
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50743
diff changeset
844 if node == candidate_node {
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
845 return Ok(rev);
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
846 }
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
847 if node.is_prefix_of(&candidate_node) {
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
848 if found_by_prefix.is_some() {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
849 return Err(RevlogError::AmbiguousPrefix);
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
850 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
851 found_by_prefix = Some(rev)
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
852 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
853 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
854 found_by_prefix.ok_or(RevlogError::InvalidRevision)
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
855 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
856
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
857 /// 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
858 pub fn has_rev(&self, rev: UncheckedRevision) -> bool {
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
859 self.index.check_revision(rev).is_some()
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
860 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
861
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
862 /// 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
863 ///
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
864 /// All entries required to build the final data out of deltas will be
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
865 /// retrieved as needed, and the deltas will be applied to the inital
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
866 /// snapshot to rebuild the final data.
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
867 pub fn get_rev_data(
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
868 &self,
50974
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
869 rev: UncheckedRevision,
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
870 ) -> Result<Cow<[u8]>, RevlogError> {
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
871 if rev == NULL_REVISION.into() {
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
872 return Ok(Cow::Borrowed(&[]));
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
873 };
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
874 self.get_entry(rev)?.data()
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
875 }
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
876
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
877 /// [`Self::get_rev_data`] for checked revisions.
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
878 pub fn get_rev_data_for_checked_rev(
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
879 &self,
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
880 rev: Revision,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
881 ) -> Result<Cow<[u8]>, RevlogError> {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
882 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
883 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
884 };
50974
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
885 self.get_entry_for_checked_rev(rev)?.data()
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
886 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
887
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
888 /// 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
889 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
890 &self,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
891 p1: Revision,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
892 p2: Revision,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
893 expected: &[u8],
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
894 data: &[u8],
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
895 ) -> bool {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
896 let e1 = self.index.get_entry(p1);
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
897 let h1 = match e1 {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
898 Some(ref entry) => entry.hash(),
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
899 None => &NULL_NODE,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
900 };
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
901 let e2 = self.index.get_entry(p2);
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
902 let h2 = match e2 {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
903 Some(ref entry) => entry.hash(),
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
904 None => &NULL_NODE,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
905 };
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
906
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
907 hash(data, h1.as_bytes(), h2.as_bytes()) == expected
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
908 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
909
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
910 /// 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
911 /// and its deltas.
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
912 fn build_data_from_deltas(
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
913 snapshot: RevlogEntry,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
914 deltas: &[RevlogEntry],
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
915 ) -> Result<Vec<u8>, HgError> {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
916 let snapshot = snapshot.data_chunk()?;
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
917 let deltas = deltas
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
918 .iter()
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
919 .rev()
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
920 .map(RevlogEntry::data_chunk)
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
921 .collect::<Result<Vec<_>, _>>()?;
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
922 let patches: Vec<_> =
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
923 deltas.iter().map(|d| patch::PatchList::new(d)).collect();
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
924 let patch = patch::fold_patch_lists(&patches);
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
925 Ok(patch.apply(&snapshot))
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
926 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
927
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
928 /// Return the revlog data.
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
929 fn data(&self) -> &[u8] {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
930 match &self.data_bytes {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
931 Some(data_bytes) => data_bytes,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
932 None => panic!(
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
933 "forgot to load the data or trying to access inline data"
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
934 ),
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
935 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
936 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
938 pub fn make_null_entry(&self) -> RevlogEntry {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
939 RevlogEntry {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
940 revlog: self,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
941 rev: NULL_REVISION,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
942 bytes: b"",
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
943 compressed_len: 0,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
944 uncompressed_len: 0,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
945 base_rev_or_base_of_delta_chain: None,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
946 p1: NULL_REVISION,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
947 p2: NULL_REVISION,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
948 flags: NULL_REVLOG_ENTRY_FLAGS,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
949 hash: NULL_NODE,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
950 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
951 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
952
50974
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
953 fn get_entry_for_checked_rev(
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
954 &self,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
955 rev: Revision,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
956 ) -> Result<RevlogEntry, RevlogError> {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
957 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
958 return Ok(self.make_null_entry());
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
959 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
960 let index_entry = self
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
961 .index
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
962 .get_entry(rev)
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
963 .ok_or(RevlogError::InvalidRevision)?;
51442
d2858d97af6c rust-index: drop offset_override
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51441
diff changeset
964 let offset = index_entry.offset();
d2858d97af6c rust-index: drop offset_override
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51441
diff changeset
965 let start = if self.index.is_inline() {
d2858d97af6c rust-index: drop offset_override
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51441
diff changeset
966 offset + ((rev.0 as usize + 1) * INDEX_ENTRY_SIZE)
d2858d97af6c rust-index: drop offset_override
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51441
diff changeset
967 } else {
d2858d97af6c rust-index: drop offset_override
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51441
diff changeset
968 offset
d2858d97af6c rust-index: drop offset_override
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51441
diff changeset
969 };
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
970 let end = start + index_entry.compressed_len() as usize;
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
971 let data = if self.index.is_inline() {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
972 self.index.data(start, end)
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
973 } else {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
974 &self.data()[start..end]
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
975 };
50974
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
976 let base_rev = self
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
977 .index
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
978 .check_revision(index_entry.base_revision_or_base_of_delta_chain())
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
979 .ok_or_else(|| {
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
980 RevlogError::corrupted(format!(
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
981 "base revision for rev {} is invalid",
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
982 rev
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
983 ))
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
984 })?;
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
985 let p1 =
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
986 self.index.check_revision(index_entry.p1()).ok_or_else(|| {
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
987 RevlogError::corrupted(format!(
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
988 "p1 for rev {} is invalid",
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
989 rev
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
990 ))
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
991 })?;
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
992 let p2 =
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
993 self.index.check_revision(index_entry.p2()).ok_or_else(|| {
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
994 RevlogError::corrupted(format!(
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
995 "p2 for rev {} is invalid",
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
996 rev
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
997 ))
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
998 })?;
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
999 let entry = RevlogEntry {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1000 revlog: self,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1001 rev,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1002 bytes: data,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1003 compressed_len: index_entry.compressed_len(),
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1004 uncompressed_len: index_entry.uncompressed_len(),
50974
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1005 base_rev_or_base_of_delta_chain: if base_rev == rev {
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1006 None
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1007 } else {
50974
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1008 Some(base_rev)
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1009 },
50974
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1010 p1,
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1011 p2,
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1012 flags: index_entry.flags(),
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1013 hash: *index_entry.hash(),
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1014 };
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1015 Ok(entry)
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1016 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1017
50974
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1018 /// Get an entry of the revlog.
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1019 pub fn get_entry(
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1020 &self,
50974
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1021 rev: UncheckedRevision,
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1022 ) -> Result<RevlogEntry, RevlogError> {
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1023 if rev == NULL_REVISION.into() {
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1024 return Ok(self.make_null_entry());
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1025 }
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1026 let rev = self.index.check_revision(rev).ok_or_else(|| {
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1027 RevlogError::corrupted(format!("rev {} is invalid", rev))
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1028 })?;
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1029 self.get_entry_for_checked_rev(rev)
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1030 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1031 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1032
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1033 /// 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
1034 /// 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
1035 #[derive(Clone)]
50409
7ef51fff2c4f rust-revlog: explicit naming for `RevlogEntry` lifetime
Georges Racinet <georges.racinet@octobus.net>
parents: 49937
diff changeset
1036 pub struct RevlogEntry<'revlog> {
7ef51fff2c4f rust-revlog: explicit naming for `RevlogEntry` lifetime
Georges Racinet <georges.racinet@octobus.net>
parents: 49937
diff changeset
1037 revlog: &'revlog Revlog,
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1038 rev: Revision,
50409
7ef51fff2c4f rust-revlog: explicit naming for `RevlogEntry` lifetime
Georges Racinet <georges.racinet@octobus.net>
parents: 49937
diff changeset
1039 bytes: &'revlog [u8],
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1040 compressed_len: u32,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1041 uncompressed_len: i32,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1042 base_rev_or_base_of_delta_chain: Option<Revision>,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1043 p1: Revision,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1044 p2: Revision,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1045 flags: u16,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1046 hash: Node,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1047 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1048
50503
74d8a1b03960 rust: speed up zstd decompression by re-using the decompression context
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50410
diff changeset
1049 thread_local! {
74d8a1b03960 rust: speed up zstd decompression by re-using the decompression context
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50410
diff changeset
1050 // seems fine to [unwrap] here: this can only fail due to memory allocation
74d8a1b03960 rust: speed up zstd decompression by re-using the decompression context
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50410
diff changeset
1051 // failing, and it's normal for that to cause panic.
74d8a1b03960 rust: speed up zstd decompression by re-using the decompression context
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50410
diff changeset
1052 static ZSTD_DECODER : RefCell<zstd::bulk::Decompressor<'static>> =
74d8a1b03960 rust: speed up zstd decompression by re-using the decompression context
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50410
diff changeset
1053 RefCell::new(zstd::bulk::Decompressor::new().ok().unwrap());
74d8a1b03960 rust: speed up zstd decompression by re-using the decompression context
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50410
diff changeset
1054 }
74d8a1b03960 rust: speed up zstd decompression by re-using the decompression context
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50410
diff changeset
1055
74d8a1b03960 rust: speed up zstd decompression by re-using the decompression context
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50410
diff changeset
1056 fn zstd_decompress_to_buffer(
74d8a1b03960 rust: speed up zstd decompression by re-using the decompression context
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50410
diff changeset
1057 bytes: &[u8],
74d8a1b03960 rust: speed up zstd decompression by re-using the decompression context
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50410
diff changeset
1058 buf: &mut Vec<u8>,
74d8a1b03960 rust: speed up zstd decompression by re-using the decompression context
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50410
diff changeset
1059 ) -> Result<usize, std::io::Error> {
74d8a1b03960 rust: speed up zstd decompression by re-using the decompression context
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50410
diff changeset
1060 ZSTD_DECODER
74d8a1b03960 rust: speed up zstd decompression by re-using the decompression context
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50410
diff changeset
1061 .with(|decoder| decoder.borrow_mut().decompress_to_buffer(bytes, buf))
74d8a1b03960 rust: speed up zstd decompression by re-using the decompression context
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50410
diff changeset
1062 }
74d8a1b03960 rust: speed up zstd decompression by re-using the decompression context
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50410
diff changeset
1063
50409
7ef51fff2c4f rust-revlog: explicit naming for `RevlogEntry` lifetime
Georges Racinet <georges.racinet@octobus.net>
parents: 49937
diff changeset
1064 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
1065 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
1066 self.rev
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1067 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1068
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1069 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
1070 &self.hash
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1071 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1072
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1073 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
1074 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
1075 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1076
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1077 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
1078 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
1079 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1080
50410
c101e7757ed7 rust-revlog: fix lifetime problem for RevlogEntry parent entries accessors
Georges Racinet <georges.racinet@octobus.net>
parents: 50409
diff changeset
1081 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
1082 &self,
c101e7757ed7 rust-revlog: fix lifetime problem for RevlogEntry parent entries accessors
Georges Racinet <georges.racinet@octobus.net>
parents: 50409
diff changeset
1083 ) -> 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
1084 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
1085 Ok(None)
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1086 } else {
50974
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1087 Ok(Some(self.revlog.get_entry_for_checked_rev(self.p1)?))
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1088 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1089 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1090
50410
c101e7757ed7 rust-revlog: fix lifetime problem for RevlogEntry parent entries accessors
Georges Racinet <georges.racinet@octobus.net>
parents: 50409
diff changeset
1091 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
1092 &self,
c101e7757ed7 rust-revlog: fix lifetime problem for RevlogEntry parent entries accessors
Georges Racinet <georges.racinet@octobus.net>
parents: 50409
diff changeset
1093 ) -> 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
1094 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
1095 Ok(None)
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1096 } else {
50974
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1097 Ok(Some(self.revlog.get_entry_for_checked_rev(self.p2)?))
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1098 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1099 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1100
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1101 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
1102 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
1103 None
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1104 } else {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1105 Some(self.p1)
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1106 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1107 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1108
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1109 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
1110 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
1111 None
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1112 } else {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1113 Some(self.p2)
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1114 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1115 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1116
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1117 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
1118 (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
1119 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1120
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1121 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
1122 // 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
1123 // 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
1124 (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
1125 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1126
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1127 /// The data for this entry, after resolving deltas if any.
50974
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1128 pub fn rawdata(&self) -> 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
1129 let mut entry = self.clone();
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1130 let mut delta_chain = vec![];
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1131
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1132 // The meaning of `base_rev_or_base_of_delta_chain` depends on
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1133 // generaldelta. See the doc on `ENTRY_DELTA_BASE` in
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1134 // `mercurial/revlogutils/constants.py` and the code in
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1135 // [_chaininfo] and in [index_deltachain].
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1136 let uses_generaldelta = self.revlog.index.uses_generaldelta();
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1137 while let Some(base_rev) = entry.base_rev_or_base_of_delta_chain {
50973
9929c8a73488 rust-revlog: split logic for `rawdata` to prepare for `UncheckedRevision` use
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50972
diff changeset
1138 entry = if uses_generaldelta {
9929c8a73488 rust-revlog: split logic for `rawdata` to prepare for `UncheckedRevision` use
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50972
diff changeset
1139 delta_chain.push(entry);
50974
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1140 self.revlog.get_entry_for_checked_rev(base_rev)?
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1141 } else {
50976
4c5f6e95df84 rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50975
diff changeset
1142 let base_rev = UncheckedRevision(entry.rev.0 - 1);
50973
9929c8a73488 rust-revlog: split logic for `rawdata` to prepare for `UncheckedRevision` use
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50972
diff changeset
1143 delta_chain.push(entry);
50974
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1144 self.revlog.get_entry(base_rev)?
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1145 };
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1146 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1147
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1148 let data = if delta_chain.is_empty() {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1149 entry.data_chunk()?
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1150 } else {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1151 Revlog::build_data_from_deltas(entry, &delta_chain)?.into()
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1152 };
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1153
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1154 Ok(data)
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1155 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1156
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1157 fn check_data(
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1158 &self,
50409
7ef51fff2c4f rust-revlog: explicit naming for `RevlogEntry` lifetime
Georges Racinet <georges.racinet@octobus.net>
parents: 49937
diff changeset
1159 data: Cow<'revlog, [u8]>,
50974
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1160 ) -> 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
1161 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
1162 self.p1,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1163 self.p2,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1164 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
1165 &data,
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1166 ) {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1167 Ok(data)
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1168 } else {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1169 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
1170 return Err(HgError::unsupported(
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1171 "ellipsis revisions are not supported by rhg",
50974
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1172 )
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1173 .into());
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1174 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1175 Err(corrupted(format!(
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1176 "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
1177 self.rev
50974
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1178 ))
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1179 .into())
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1180 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1181 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1182
50974
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1183 pub fn data(&self) -> 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
1184 let data = self.rawdata()?;
50743
124c44b5cfad rust-revlog: fix RevlogEntry.data() for NULL_REVISION
Georges Racinet <georges.racinet@octobus.net>
parents: 50742
diff changeset
1185 if self.rev == NULL_REVISION {
124c44b5cfad rust-revlog: fix RevlogEntry.data() for NULL_REVISION
Georges Racinet <georges.racinet@octobus.net>
parents: 50742
diff changeset
1186 return Ok(data);
124c44b5cfad rust-revlog: fix RevlogEntry.data() for NULL_REVISION
Georges Racinet <georges.racinet@octobus.net>
parents: 50742
diff changeset
1187 }
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1188 if self.is_censored() {
50974
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1189 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
1190 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1191 self.check_data(data)
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1192 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1193
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1194 /// Extract the data contained in the entry.
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1195 /// This may be a delta. (See `is_delta`.)
50409
7ef51fff2c4f rust-revlog: explicit naming for `RevlogEntry` lifetime
Georges Racinet <georges.racinet@octobus.net>
parents: 49937
diff changeset
1196 fn data_chunk(&self) -> Result<Cow<'revlog, [u8]>, HgError> {
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1197 if self.bytes.is_empty() {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1198 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
1199 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1200 match self.bytes[0] {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1201 // Revision data is the entirety of the entry, including this
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1202 // header.
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1203 b'\0' => Ok(Cow::Borrowed(self.bytes)),
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1204 // Raw revision data follows.
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1205 b'u' => Ok(Cow::Borrowed(&self.bytes[1..])),
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1206 // zlib (RFC 1950) data.
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1207 b'x' => Ok(Cow::Owned(self.uncompressed_zlib_data()?)),
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1208 // zstd data.
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1209 b'\x28' => Ok(Cow::Owned(self.uncompressed_zstd_data()?)),
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1210 // A proper new format should have had a repo/store requirement.
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1211 format_type => Err(corrupted(format!(
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1212 "unknown compression header '{}'",
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1213 format_type
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1214 ))),
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1215 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1216 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1217
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1218 fn uncompressed_zlib_data(&self) -> Result<Vec<u8>, HgError> {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1219 let mut decoder = ZlibDecoder::new(self.bytes);
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1220 if self.is_delta() {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1221 let mut buf = Vec::with_capacity(self.compressed_len as usize);
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1222 decoder
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1223 .read_to_end(&mut buf)
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1224 .map_err(|e| corrupted(e.to_string()))?;
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1225 Ok(buf)
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1226 } else {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1227 let cap = self.uncompressed_len.max(0) as usize;
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1228 let mut buf = vec![0; cap];
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1229 decoder
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1230 .read_exact(&mut buf)
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1231 .map_err(|e| corrupted(e.to_string()))?;
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1232 Ok(buf)
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1233 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1234 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1235
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1236 fn uncompressed_zstd_data(&self) -> Result<Vec<u8>, HgError> {
50505
39ed7b2953bb rust: mostly avoid streaming zstd decompression
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50504
diff changeset
1237 let cap = self.uncompressed_len.max(0) as usize;
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1238 if self.is_delta() {
50505
39ed7b2953bb rust: mostly avoid streaming zstd decompression
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50504
diff changeset
1239 // [cap] is usually an over-estimate of the space needed because
39ed7b2953bb rust: mostly avoid streaming zstd decompression
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50504
diff changeset
1240 // it's the length of delta-decoded data, but we're interested
39ed7b2953bb rust: mostly avoid streaming zstd decompression
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50504
diff changeset
1241 // in the size of the delta.
39ed7b2953bb rust: mostly avoid streaming zstd decompression
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50504
diff changeset
1242 // This means we have to [shrink_to_fit] to avoid holding on
39ed7b2953bb rust: mostly avoid streaming zstd decompression
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50504
diff changeset
1243 // to a large chunk of memory, but it also means we must have a
39ed7b2953bb rust: mostly avoid streaming zstd decompression
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50504
diff changeset
1244 // fallback branch, for the case when the delta is longer than
39ed7b2953bb rust: mostly avoid streaming zstd decompression
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50504
diff changeset
1245 // the original data (surprisingly, this does happen in practice)
39ed7b2953bb rust: mostly avoid streaming zstd decompression
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50504
diff changeset
1246 let mut buf = Vec::with_capacity(cap);
39ed7b2953bb rust: mostly avoid streaming zstd decompression
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50504
diff changeset
1247 match zstd_decompress_to_buffer(self.bytes, &mut buf) {
39ed7b2953bb rust: mostly avoid streaming zstd decompression
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50504
diff changeset
1248 Ok(_) => buf.shrink_to_fit(),
39ed7b2953bb rust: mostly avoid streaming zstd decompression
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50504
diff changeset
1249 Err(_) => {
39ed7b2953bb rust: mostly avoid streaming zstd decompression
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50504
diff changeset
1250 buf.clear();
39ed7b2953bb rust: mostly avoid streaming zstd decompression
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50504
diff changeset
1251 zstd::stream::copy_decode(self.bytes, &mut buf)
39ed7b2953bb rust: mostly avoid streaming zstd decompression
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50504
diff changeset
1252 .map_err(|e| corrupted(e.to_string()))?;
39ed7b2953bb rust: mostly avoid streaming zstd decompression
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50504
diff changeset
1253 }
39ed7b2953bb rust: mostly avoid streaming zstd decompression
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50504
diff changeset
1254 };
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1255 Ok(buf)
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1256 } else {
50504
d1cab48354bc rust: in zstd decompression, avoid a useless vec initialization
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50503
diff changeset
1257 let mut buf = Vec::with_capacity(cap);
50503
74d8a1b03960 rust: speed up zstd decompression by re-using the decompression context
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50410
diff changeset
1258 let len = zstd_decompress_to_buffer(self.bytes, &mut buf)
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1259 .map_err(|e| corrupted(e.to_string()))?;
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1260 if len != self.uncompressed_len as usize {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1261 Err(corrupted("uncompressed length does not match"))
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1262 } else {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1263 Ok(buf)
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1264 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1265 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1266 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1267
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1268 /// Tell if the entry is a snapshot or a delta
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1269 /// (influences on decompression).
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1270 fn is_delta(&self) -> bool {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1271 self.base_rev_or_base_of_delta_chain.is_some()
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1272 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1273 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1274
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1275 /// Calculate the hash of a revision given its data and its parents.
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1276 fn hash(
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1277 data: &[u8],
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1278 p1_hash: &[u8],
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1279 p2_hash: &[u8],
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1280 ) -> [u8; NODE_BYTES_LENGTH] {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1281 let mut hasher = Sha1::new();
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1282 let (a, b) = (p1_hash, p2_hash);
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1283 if a > b {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1284 hasher.update(b);
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1285 hasher.update(a);
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1286 } else {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1287 hasher.update(a);
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1288 hasher.update(b);
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1289 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1290 hasher.update(data);
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1291 *hasher.finalize().as_ref()
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1292 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1293
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1294 #[cfg(test)]
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1295 mod tests {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1296 use super::*;
51441
c3f2a9b55f59 rust-index: stop calling `with_offset` in the tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51253
diff changeset
1297 use crate::index::IndexEntryBuilder;
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1298 use itertools::Itertools;
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1299
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1300 #[test]
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1301 fn test_empty() {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1302 let temp = tempfile::tempdir().unwrap();
51864
db7dbe6f7bb2 rust: add Vfs trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51863
diff changeset
1303 let vfs = VfsImpl {
db7dbe6f7bb2 rust: add Vfs trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51863
diff changeset
1304 base: temp.path().to_owned(),
db7dbe6f7bb2 rust: add Vfs trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51863
diff changeset
1305 };
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1306 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
1307 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
1308 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
1309 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
1310 .unwrap();
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1311 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
1312 assert_eq!(revlog.len(), 0);
50974
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1313 assert!(revlog.get_entry(0.into()).is_err());
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1314 assert!(!revlog.has_rev(0.into()));
50742
3338c6ffdaa3 rust-revlog: using constant in test
Georges Racinet <georges.racinet@octobus.net>
parents: 50741
diff changeset
1315 assert_eq!(
3338c6ffdaa3 rust-revlog: using constant in test
Georges Racinet <georges.racinet@octobus.net>
parents: 50741
diff changeset
1316 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
1317 NULL_REVISION
3338c6ffdaa3 rust-revlog: using constant in test
Georges Racinet <georges.racinet@octobus.net>
parents: 50741
diff changeset
1318 );
50974
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1319 let null_entry = revlog.get_entry(NULL_REVISION.into()).ok().unwrap();
50743
124c44b5cfad rust-revlog: fix RevlogEntry.data() for NULL_REVISION
Georges Racinet <georges.racinet@octobus.net>
parents: 50742
diff changeset
1320 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
1321 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
1322 }
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1323
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1324 #[test]
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1325 fn test_inline() {
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1326 let temp = tempfile::tempdir().unwrap();
51864
db7dbe6f7bb2 rust: add Vfs trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51863
diff changeset
1327 let vfs = VfsImpl {
db7dbe6f7bb2 rust: add Vfs trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51863
diff changeset
1328 base: temp.path().to_owned(),
db7dbe6f7bb2 rust: add Vfs trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51863
diff changeset
1329 };
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1330 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
1331 .unwrap();
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1332 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
1333 .unwrap();
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1334 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
1335 .unwrap();
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1336 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
1337 .is_first(true)
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1338 .with_version(1)
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1339 .with_inline(true)
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1340 .with_node(node0)
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1341 .build();
51441
c3f2a9b55f59 rust-index: stop calling `with_offset` in the tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51253
diff changeset
1342 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
1343 let entry2_bytes = IndexEntryBuilder::new()
50976
4c5f6e95df84 rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50975
diff changeset
1344 .with_p1(Revision(0))
4c5f6e95df84 rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50975
diff changeset
1345 .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
1346 .with_node(node2)
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1347 .build();
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1348 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
1349 .into_iter()
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1350 .flatten()
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1351 .collect_vec();
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1352 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
1353 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
1354 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
1355 .unwrap();
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1356
50974
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1357 let entry0 = revlog.get_entry(0.into()).ok().unwrap();
50976
4c5f6e95df84 rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50975
diff changeset
1358 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
1359 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
1360 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
1361 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
1362 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
1363 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
1364 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
1365 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
1366 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
1367
50974
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1368 let entry1 = revlog.get_entry(1.into()).ok().unwrap();
50976
4c5f6e95df84 rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50975
diff changeset
1369 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
1370 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
1371 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
1372 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
1373 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
1374 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
1375 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
1376 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
1377 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
1378
50974
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1379 let entry2 = revlog.get_entry(2.into()).ok().unwrap();
50976
4c5f6e95df84 rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50975
diff changeset
1380 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
1381 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
1382 assert!(entry2.has_p1());
50976
4c5f6e95df84 rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50975
diff changeset
1383 assert_eq!(entry2.p1(), Some(Revision(0)));
4c5f6e95df84 rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50975
diff changeset
1384 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
1385 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
1386 assert!(p1_entry.is_some());
50976
4c5f6e95df84 rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50975
diff changeset
1387 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
1388 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
1389 assert!(p2_entry.is_some());
50976
4c5f6e95df84 rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50975
diff changeset
1390 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
1391 }
50741
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1392
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1393 #[test]
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1394 fn test_nodemap() {
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1395 let temp = tempfile::tempdir().unwrap();
51864
db7dbe6f7bb2 rust: add Vfs trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51863
diff changeset
1396 let vfs = VfsImpl {
db7dbe6f7bb2 rust: add Vfs trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51863
diff changeset
1397 base: temp.path().to_owned(),
db7dbe6f7bb2 rust: add Vfs trait
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51863
diff changeset
1398 };
50741
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1399
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1400 // 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
1401 // 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
1402 // 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
1403 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
1404 .unwrap();
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1405 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
1406 .unwrap();
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1407 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
1408 .is_first(true)
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1409 .with_version(1)
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1410 .with_inline(true)
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1411 .with_node(node0)
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1412 .build();
51441
c3f2a9b55f59 rust-index: stop calling `with_offset` in the tests
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 51253
diff changeset
1413 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
1414 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
1415 .into_iter()
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1416 .flatten()
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1417 .collect_vec();
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1418 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
1419
eccf7dc7c91e revlog: make the rust test for node hex prefix resolution exercise the nodemap
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 50982
diff changeset
1420 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
1421 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
1422 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
1423
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
1424 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
1425 &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
1426 "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
1427 None,
51863
69b804c8e09e rust: use new revlog configs in all revlog opening code
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51862
diff changeset
1428 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
1429 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
1430 )
13f58ce70299 rust-revlog: teach the revlog opening code to read the repo options
Rapha?l Gom?s <rgomes@octobus.net>
parents: 51117
diff changeset
1431 .unwrap();
50741
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1432
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1433 // accessing the data shows the corruption
50974
1928b770e3e7 rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50973
diff changeset
1434 revlog.get_entry(0.into()).unwrap().data().unwrap_err();
50741
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1435
50976
4c5f6e95df84 rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50975
diff changeset
1436 assert_eq!(
4c5f6e95df84 rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50975
diff changeset
1437 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
1438 Revision(-1)
4c5f6e95df84 rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50975
diff changeset
1439 );
4c5f6e95df84 rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50975
diff changeset
1440 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
1441 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
1442 assert_eq!(
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1443 revlog
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1444 .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
1445 .unwrap(),
50976
4c5f6e95df84 rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50975
diff changeset
1446 Revision(-1)
50741
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1447 );
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1448 assert_eq!(
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1449 revlog
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1450 .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
1451 .unwrap(),
50976
4c5f6e95df84 rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents: 50975
diff changeset
1452 Revision(1)
50741
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1453 );
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1454 // 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
1455 // (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
1456 match revlog
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1457 .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
1458 .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
1459 {
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1460 RevlogError::AmbiguousPrefix => (),
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1461 e => {
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1462 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
1463 }
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1464 };
bca4037306da rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents: 50740
diff changeset
1465 }
49937
750409505286 rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47961
diff changeset
1466 }