Mercurial > public > mercurial-scm > hg
annotate rust/hg-core/src/revlog/mod.rs @ 51117:532e74ad3ff6
rust: run a clippy pass with the latest stable version
Our current version of clippy is older than the latest stable.
The newest version has new lints that are moslty good advice, so let's apply
them ahead of time. This has the added benefit of reducing the noise for
developpers like myself that use clippy as an IDE helper, as well as being
more prepared for a future clippy upgrade.
author | Rapha?l Gom?s <rgomes@octobus.net> |
---|---|
date | Mon, 06 Nov 2023 11:06:08 +0100 |
parents | 12c308c55e53 |
children | 13f58ce70299 |
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; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
20 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
|
21 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
|
22 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
|
23 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
24 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
|
25 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
|
26 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
|
27 use zstd; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
28 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
29 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
|
30 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
|
31 use super::index::Index; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
32 use super::nodemap::{NodeMap, NodeMapError}; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
33 use crate::errors::HgError; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
34 use crate::vfs::Vfs; |
44142
63db6657d280
rust-nodemap: building blocks for nodetree structures
Georges Racinet <georges.racinet@octobus.net>
parents:
44088
diff
changeset
|
35 |
44005
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
36 /// 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
|
37 /// 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
|
38 pub type BaseRevision = i32; |
44005
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
39 |
50976
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
40 /// Mercurial revision numbers |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
41 /// 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
|
42 /// 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
|
43 /// 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
|
44 #[derive( |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
45 Debug, |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
46 derive_more::Display, |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
47 Clone, |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
48 Copy, |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
49 Hash, |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
50 PartialEq, |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
51 Eq, |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
52 PartialOrd, |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
53 Ord, |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
54 )] |
50976
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
55 pub struct Revision(pub BaseRevision); |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
56 |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
57 impl format_bytes::DisplayBytes for Revision { |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
58 fn display_bytes( |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
59 &self, |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
60 output: &mut dyn std::io::Write, |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
61 ) -> std::io::Result<()> { |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
62 self.0.display_bytes(output) |
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 } |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
65 |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
66 /// Unchecked Mercurial revision numbers. |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
67 /// |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
68 /// 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
|
69 /// 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
|
70 /// the appropriate index object. |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
71 #[derive( |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
72 Debug, |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
73 derive_more::Display, |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
74 Clone, |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
75 Copy, |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
76 Hash, |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
77 PartialEq, |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
78 Eq, |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
79 PartialOrd, |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
80 Ord, |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
81 )] |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
82 pub struct UncheckedRevision(pub BaseRevision); |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
83 |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
84 impl format_bytes::DisplayBytes for UncheckedRevision { |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
85 fn display_bytes( |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
86 &self, |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
87 output: &mut dyn std::io::Write, |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
88 ) -> std::io::Result<()> { |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
89 self.0.display_bytes(output) |
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 } |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
92 |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
93 impl From<Revision> for UncheckedRevision { |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
94 fn from(value: Revision) -> Self { |
50976
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
95 Self(value.0) |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
96 } |
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 |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
99 impl From<BaseRevision> for UncheckedRevision { |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
100 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
|
101 Self(value) |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
102 } |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
103 } |
44005
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
104 |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
105 /// Marker expressing the absence of a parent |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
106 /// |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
107 /// 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
|
108 /// 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
|
109 pub const NULL_REVISION: Revision = Revision(-1); |
44005
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
110 |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
111 /// Same as `mercurial.node.wdirrev` |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
112 /// |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
113 /// 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
|
114 /// 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
|
115 #[allow(clippy::unreadable_literal)] |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
116 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
|
117 UncheckedRevision(0x7fffffff); |
44005
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
118 |
46821
e8ae91b1a63d
rhg: raise wdir specific error for `hg debugdata`
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46431
diff
changeset
|
119 pub const WORKING_DIRECTORY_HEX: &str = |
e8ae91b1a63d
rhg: raise wdir specific error for `hg debugdata`
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46431
diff
changeset
|
120 "ffffffffffffffffffffffffffffffffffffffff"; |
e8ae91b1a63d
rhg: raise wdir specific error for `hg debugdata`
Pulkit Goyal <7895pulkit@gmail.com>
parents:
46431
diff
changeset
|
121 |
44005
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
122 /// 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
|
123 pub trait Graph { |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
124 /// Return the two parents of the given `Revision`. |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
125 /// |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
126 /// 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
|
127 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
|
128 } |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
129 |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
130 #[derive(Clone, Debug, PartialEq)] |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
131 pub enum GraphError { |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
132 ParentOutOfRange(Revision), |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
diff
changeset
|
133 } |
44181
3fb39dc2e356
rust-revlog: a trait for the revlog index
Georges Racinet <georges.racinet@octobus.net>
parents:
44143
diff
changeset
|
134 |
3fb39dc2e356
rust-revlog: a trait for the revlog index
Georges Racinet <georges.racinet@octobus.net>
parents:
44143
diff
changeset
|
135 /// The Mercurial Revlog Index |
3fb39dc2e356
rust-revlog: a trait for the revlog index
Georges Racinet <georges.racinet@octobus.net>
parents:
44143
diff
changeset
|
136 /// |
3fb39dc2e356
rust-revlog: a trait for the revlog index
Georges Racinet <georges.racinet@octobus.net>
parents:
44143
diff
changeset
|
137 /// 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
|
138 /// 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
|
139 pub trait RevlogIndex { |
3fb39dc2e356
rust-revlog: a trait for the revlog index
Georges Racinet <georges.racinet@octobus.net>
parents:
44143
diff
changeset
|
140 /// 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
|
141 fn len(&self) -> usize; |
3fb39dc2e356
rust-revlog: a trait for the revlog index
Georges Racinet <georges.racinet@octobus.net>
parents:
44143
diff
changeset
|
142 |
44973
26114bd6ec60
rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44182
diff
changeset
|
143 fn is_empty(&self) -> bool { |
26114bd6ec60
rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44182
diff
changeset
|
144 self.len() == 0 |
26114bd6ec60
rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44182
diff
changeset
|
145 } |
26114bd6ec60
rust: do a clippy pass
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44182
diff
changeset
|
146 |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
147 /// 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
|
148 fn node(&self, rev: Revision) -> Option<&Node>; |
50971
c950fdba7472
rust: add `UncheckedRevision` type
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50743
diff
changeset
|
149 |
c950fdba7472
rust: add `UncheckedRevision` type
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50743
diff
changeset
|
150 /// Return a [`Revision`] if `rev` is a valid revision number for this |
c950fdba7472
rust: add `UncheckedRevision` type
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50743
diff
changeset
|
151 /// index |
c950fdba7472
rust: add `UncheckedRevision` type
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50743
diff
changeset
|
152 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
|
153 let rev = rev.0; |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
154 |
50976
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
155 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
|
156 { |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
157 Some(Revision(rev)) |
50971
c950fdba7472
rust: add `UncheckedRevision` type
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50743
diff
changeset
|
158 } else { |
c950fdba7472
rust: add `UncheckedRevision` type
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50743
diff
changeset
|
159 None |
c950fdba7472
rust: add `UncheckedRevision` type
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50743
diff
changeset
|
160 } |
c950fdba7472
rust: add `UncheckedRevision` type
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50743
diff
changeset
|
161 } |
44181
3fb39dc2e356
rust-revlog: a trait for the revlog index
Georges Racinet <georges.racinet@octobus.net>
parents:
44143
diff
changeset
|
162 } |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
163 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
164 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
|
165 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
|
166 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
|
167 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
|
168 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
169 // 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
|
170 // 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
|
171 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
|
172 | REVISION_FLAG_ELLIPSIS |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
173 | REVISION_FLAG_EXTSTORED |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
174 | REVISION_FLAG_HASCOPIESINFO; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
175 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
176 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
|
177 |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
178 #[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
|
179 pub enum RevlogError { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
180 InvalidRevision, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
181 /// 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
|
182 WDirUnsupported, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
183 /// 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
|
184 AmbiguousPrefix, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
185 #[from] |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
186 Other(HgError), |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
187 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
188 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
189 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
|
190 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
|
191 match error { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
192 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
|
193 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
|
194 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
|
195 ), |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
196 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
197 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
198 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
199 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
200 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
|
201 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
|
202 } |
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 impl RevlogError { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
205 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
|
206 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
|
207 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
208 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
209 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
210 /// 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
|
211 pub struct Revlog { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
212 /// 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
|
213 /// 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
|
214 /// data. |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
215 index: Index, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
216 /// 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
|
217 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
|
218 /// 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
|
219 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
|
220 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
221 |
50975
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50974
diff
changeset
|
222 impl Graph for Revlog { |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50974
diff
changeset
|
223 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
|
224 self.index.parents(rev) |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50974
diff
changeset
|
225 } |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50974
diff
changeset
|
226 } |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50974
diff
changeset
|
227 |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
228 impl Revlog { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
229 /// 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
|
230 /// |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
231 /// 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
|
232 /// interleaved. |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
233 pub fn open( |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
234 store_vfs: &Vfs, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
235 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
|
236 data_path: Option<&Path>, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
237 use_nodemap: bool, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
238 ) -> Result<Self, HgError> { |
50983
eccf7dc7c91e
revlog: make the rust test for node hex prefix resolution exercise the nodemap
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50982
diff
changeset
|
239 Self::open_gen(store_vfs, index_path, data_path, use_nodemap, None) |
eccf7dc7c91e
revlog: make the rust test for node hex prefix resolution exercise the nodemap
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50982
diff
changeset
|
240 } |
eccf7dc7c91e
revlog: make the rust test for node hex prefix resolution exercise the nodemap
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50982
diff
changeset
|
241 |
eccf7dc7c91e
revlog: make the rust test for node hex prefix resolution exercise the nodemap
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50982
diff
changeset
|
242 fn open_gen( |
eccf7dc7c91e
revlog: make the rust test for node hex prefix resolution exercise the nodemap
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50982
diff
changeset
|
243 store_vfs: &Vfs, |
eccf7dc7c91e
revlog: make the rust test for node hex prefix resolution exercise the nodemap
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50982
diff
changeset
|
244 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
|
245 data_path: Option<&Path>, |
eccf7dc7c91e
revlog: make the rust test for node hex prefix resolution exercise the nodemap
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50982
diff
changeset
|
246 use_nodemap: bool, |
eccf7dc7c91e
revlog: make the rust test for node hex prefix resolution exercise the nodemap
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50982
diff
changeset
|
247 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
|
248 ) -> 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
|
249 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
|
250 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
|
251 match store_vfs.mmap_open_opt(index_path)? { |
532e74ad3ff6
rust: run a clippy pass with the latest stable version
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50990
diff
changeset
|
252 None => Index::new(Box::<Vec<_>>::default()), |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
253 Some(index_mmap) => { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
254 let index = Index::new(Box::new(index_mmap))?; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
255 Ok(index) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
256 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
257 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
258 }?; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
259 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
260 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
|
261 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
262 // type annotation required |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
263 // 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
|
264 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
|
265 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
|
266 None |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
267 } else { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
268 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
|
269 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
|
270 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
|
271 }; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
272 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
273 let nodemap = if index.is_inline() || !use_nodemap { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
274 None |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
275 } else { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
276 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
|
277 |(docket, data)| { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
278 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
|
279 Box::new(data), |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
280 docket.data_length, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
281 ) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
282 }, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
283 ) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
284 }; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
285 |
50983
eccf7dc7c91e
revlog: make the rust test for node hex prefix resolution exercise the nodemap
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50982
diff
changeset
|
286 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
|
287 |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
288 Ok(Revlog { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
289 index, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
290 data_bytes, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
291 nodemap, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
292 }) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
293 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
294 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
295 /// 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
|
296 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
|
297 self.index.len() |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
298 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
299 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
300 /// 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
|
301 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
|
302 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
|
303 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
304 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
305 /// 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
|
306 /// revlog |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
307 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
|
308 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
|
309 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
|
310 } |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
311 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
|
312 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
|
313 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
314 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
315 /// 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
|
316 /// revlog |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
317 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
|
318 &self, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
319 node: NodePrefix, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
320 ) -> 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
|
321 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
|
322 nodemap |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
323 .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
|
324 .ok_or(RevlogError::InvalidRevision) |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
325 } else { |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
326 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
|
327 } |
50740
0159b014f3ab
rust-revlog: split out method for `rev_from_node` without persistent nodemap
Georges Racinet <georges.racinet@octobus.net>
parents:
50505
diff
changeset
|
328 } |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
329 |
50740
0159b014f3ab
rust-revlog: split out method for `rev_from_node` without persistent nodemap
Georges Racinet <georges.racinet@octobus.net>
parents:
50505
diff
changeset
|
330 /// 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
|
331 /// |
0159b014f3ab
rust-revlog: split out method for `rev_from_node` without persistent nodemap
Georges Racinet <georges.racinet@octobus.net>
parents:
50505
diff
changeset
|
332 /// 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
|
333 /// 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
|
334 /// 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
|
335 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
|
336 &self, |
0159b014f3ab
rust-revlog: split out method for `rev_from_node` without persistent nodemap
Georges Racinet <georges.racinet@octobus.net>
parents:
50505
diff
changeset
|
337 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
|
338 ) -> 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
|
339 // 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
|
340 // 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
|
341 // optimize these cases. |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
342 let mut found_by_prefix = None; |
50990
12c308c55e53
branching: merge stable into default
Pierre-Yves David <pierre-yves.david@octobus.net>
diff
changeset
|
343 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
|
344 let rev = Revision(rev as BaseRevision); |
50990
12c308c55e53
branching: merge stable into default
Pierre-Yves David <pierre-yves.david@octobus.net>
diff
changeset
|
345 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
|
346 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
|
347 } 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
|
348 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
|
349 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
|
350 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
|
351 "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
|
352 ) |
363620b934aa
revlog: fix a bug where NULL_NODE failed to be resolved to NULL_REV
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50743
diff
changeset
|
353 })?; |
363620b934aa
revlog: fix a bug where NULL_NODE failed to be resolved to NULL_REV
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50743
diff
changeset
|
354 *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
|
355 }; |
363620b934aa
revlog: fix a bug where NULL_NODE failed to be resolved to NULL_REV
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50743
diff
changeset
|
356 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
|
357 return Ok(rev); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
358 } |
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
|
359 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
|
360 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
|
361 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
|
362 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
363 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
|
364 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
365 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
366 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
|
367 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
368 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
369 /// 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
|
370 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
|
371 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
|
372 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
373 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
374 /// 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
|
375 /// |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
376 /// 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
|
377 /// 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
|
378 /// 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
|
379 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
|
380 &self, |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
381 rev: UncheckedRevision, |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
382 ) -> Result<Cow<[u8]>, RevlogError> { |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
383 if rev == NULL_REVISION.into() { |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
384 return Ok(Cow::Borrowed(&[])); |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
385 }; |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
386 self.get_entry(rev)?.data() |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
387 } |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
388 |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
389 /// [`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
|
390 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
|
391 &self, |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
392 rev: Revision, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
393 ) -> 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
|
394 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
|
395 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
|
396 }; |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
397 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
|
398 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
399 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
400 /// 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
|
401 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
|
402 &self, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
403 p1: Revision, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
404 p2: Revision, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
405 expected: &[u8], |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
406 data: &[u8], |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
407 ) -> bool { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
408 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
|
409 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
|
410 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
|
411 None => &NULL_NODE, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
412 }; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
413 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
|
414 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
|
415 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
|
416 None => &NULL_NODE, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
417 }; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
418 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
419 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
|
420 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
421 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
422 /// 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
|
423 /// and its deltas. |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
424 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
|
425 snapshot: RevlogEntry, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
426 deltas: &[RevlogEntry], |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
427 ) -> 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
|
428 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
|
429 let deltas = deltas |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
430 .iter() |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
431 .rev() |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
432 .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
|
433 .collect::<Result<Vec<_>, _>>()?; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
434 let patches: Vec<_> = |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
435 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
|
436 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
|
437 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
|
438 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
439 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
440 /// 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
|
441 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
|
442 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
|
443 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
|
444 None => panic!( |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
445 "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
|
446 ), |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
447 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
448 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
449 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
450 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
|
451 RevlogEntry { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
452 revlog: self, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
453 rev: NULL_REVISION, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
454 bytes: b"", |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
455 compressed_len: 0, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
456 uncompressed_len: 0, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
457 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
|
458 p1: NULL_REVISION, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
459 p2: NULL_REVISION, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
460 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
|
461 hash: NULL_NODE, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
462 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
463 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
464 |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
465 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
|
466 &self, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
467 rev: Revision, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
468 ) -> Result<RevlogEntry, RevlogError> { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
469 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
|
470 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
|
471 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
472 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
|
473 .index |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
474 .get_entry(rev) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
475 .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
|
476 let start = index_entry.offset(); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
477 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
|
478 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
|
479 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
|
480 } else { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
481 &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
|
482 }; |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
483 let base_rev = self |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
484 .index |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
485 .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
|
486 .ok_or_else(|| { |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
487 RevlogError::corrupted(format!( |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
488 "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
|
489 rev |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
490 )) |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
491 })?; |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
492 let p1 = |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
493 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
|
494 RevlogError::corrupted(format!( |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
495 "p1 for rev {} is invalid", |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
496 rev |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
497 )) |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
498 })?; |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
499 let p2 = |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
500 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
|
501 RevlogError::corrupted(format!( |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
502 "p2 for rev {} is invalid", |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
503 rev |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
504 )) |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
505 })?; |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
506 let entry = RevlogEntry { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
507 revlog: self, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
508 rev, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
509 bytes: data, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
510 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
|
511 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
|
512 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
|
513 None |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
514 } else { |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
515 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
|
516 }, |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
517 p1, |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
518 p2, |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
519 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
|
520 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
|
521 }; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
522 Ok(entry) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
523 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
524 |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
525 /// 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
|
526 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
|
527 &self, |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
528 rev: UncheckedRevision, |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
529 ) -> Result<RevlogEntry, RevlogError> { |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
530 if rev == NULL_REVISION.into() { |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
531 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
|
532 } |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
533 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
|
534 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
|
535 })?; |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
536 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
|
537 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
538 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
539 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
540 /// 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
|
541 /// 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
|
542 #[derive(Clone)] |
50409
7ef51fff2c4f
rust-revlog: explicit naming for `RevlogEntry` lifetime
Georges Racinet <georges.racinet@octobus.net>
parents:
49937
diff
changeset
|
543 pub struct RevlogEntry<'revlog> { |
7ef51fff2c4f
rust-revlog: explicit naming for `RevlogEntry` lifetime
Georges Racinet <georges.racinet@octobus.net>
parents:
49937
diff
changeset
|
544 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
|
545 rev: Revision, |
50409
7ef51fff2c4f
rust-revlog: explicit naming for `RevlogEntry` lifetime
Georges Racinet <georges.racinet@octobus.net>
parents:
49937
diff
changeset
|
546 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
|
547 compressed_len: u32, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
548 uncompressed_len: i32, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
549 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
|
550 p1: Revision, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
551 p2: Revision, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
552 flags: u16, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
553 hash: Node, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
554 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
555 |
50503
74d8a1b03960
rust: speed up zstd decompression by re-using the decompression context
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50410
diff
changeset
|
556 thread_local! { |
74d8a1b03960
rust: speed up zstd decompression by re-using the decompression context
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50410
diff
changeset
|
557 // 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
|
558 // 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
|
559 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
|
560 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
|
561 } |
74d8a1b03960
rust: speed up zstd decompression by re-using the decompression context
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50410
diff
changeset
|
562 |
74d8a1b03960
rust: speed up zstd decompression by re-using the decompression context
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50410
diff
changeset
|
563 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
|
564 bytes: &[u8], |
74d8a1b03960
rust: speed up zstd decompression by re-using the decompression context
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50410
diff
changeset
|
565 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
|
566 ) -> 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
|
567 ZSTD_DECODER |
74d8a1b03960
rust: speed up zstd decompression by re-using the decompression context
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50410
diff
changeset
|
568 .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
|
569 } |
74d8a1b03960
rust: speed up zstd decompression by re-using the decompression context
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50410
diff
changeset
|
570 |
50409
7ef51fff2c4f
rust-revlog: explicit naming for `RevlogEntry` lifetime
Georges Racinet <georges.racinet@octobus.net>
parents:
49937
diff
changeset
|
571 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
|
572 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
|
573 self.rev |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
574 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
575 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
576 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
|
577 &self.hash |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
578 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
579 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
580 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
|
581 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
|
582 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
583 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
584 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
|
585 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
|
586 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
587 |
50410
c101e7757ed7
rust-revlog: fix lifetime problem for RevlogEntry parent entries accessors
Georges Racinet <georges.racinet@octobus.net>
parents:
50409
diff
changeset
|
588 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
|
589 &self, |
c101e7757ed7
rust-revlog: fix lifetime problem for RevlogEntry parent entries accessors
Georges Racinet <georges.racinet@octobus.net>
parents:
50409
diff
changeset
|
590 ) -> 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
|
591 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
|
592 Ok(None) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
593 } else { |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
594 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
|
595 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
596 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
597 |
50410
c101e7757ed7
rust-revlog: fix lifetime problem for RevlogEntry parent entries accessors
Georges Racinet <georges.racinet@octobus.net>
parents:
50409
diff
changeset
|
598 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
|
599 &self, |
c101e7757ed7
rust-revlog: fix lifetime problem for RevlogEntry parent entries accessors
Georges Racinet <georges.racinet@octobus.net>
parents:
50409
diff
changeset
|
600 ) -> 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
|
601 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
|
602 Ok(None) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
603 } else { |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
604 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
|
605 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
606 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
607 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
608 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
|
609 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
|
610 None |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
611 } else { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
612 Some(self.p1) |
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 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
615 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
616 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
|
617 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
|
618 None |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
619 } else { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
620 Some(self.p2) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
621 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
622 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
623 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
624 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
|
625 (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
|
626 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
627 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
628 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
|
629 // 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
|
630 // 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
|
631 (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
|
632 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
633 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
634 /// 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
|
635 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
|
636 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
|
637 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
|
638 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
639 // 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
|
640 // 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
|
641 // `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
|
642 // [_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
|
643 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
|
644 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
|
645 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
|
646 delta_chain.push(entry); |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
647 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
|
648 } else { |
50976
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
649 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
|
650 delta_chain.push(entry); |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
651 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
|
652 }; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
653 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
654 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
655 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
|
656 entry.data_chunk()? |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
657 } else { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
658 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
|
659 }; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
660 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
661 Ok(data) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
662 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
663 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
664 fn check_data( |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
665 &self, |
50409
7ef51fff2c4f
rust-revlog: explicit naming for `RevlogEntry` lifetime
Georges Racinet <georges.racinet@octobus.net>
parents:
49937
diff
changeset
|
666 data: Cow<'revlog, [u8]>, |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
667 ) -> 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
|
668 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
|
669 self.p1, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
670 self.p2, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
671 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
|
672 &data, |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
673 ) { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
674 Ok(data) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
675 } else { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
676 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
|
677 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
|
678 "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
|
679 ) |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
680 .into()); |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
681 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
682 Err(corrupted(format!( |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
683 "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
|
684 self.rev |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
685 )) |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
686 .into()) |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
687 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
688 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
689 |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
690 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
|
691 let data = self.rawdata()?; |
50743
124c44b5cfad
rust-revlog: fix RevlogEntry.data() for NULL_REVISION
Georges Racinet <georges.racinet@octobus.net>
parents:
50742
diff
changeset
|
692 if self.rev == NULL_REVISION { |
124c44b5cfad
rust-revlog: fix RevlogEntry.data() for NULL_REVISION
Georges Racinet <georges.racinet@octobus.net>
parents:
50742
diff
changeset
|
693 return Ok(data); |
124c44b5cfad
rust-revlog: fix RevlogEntry.data() for NULL_REVISION
Georges Racinet <georges.racinet@octobus.net>
parents:
50742
diff
changeset
|
694 } |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
695 if self.is_censored() { |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
696 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
|
697 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
698 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
|
699 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
700 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
701 /// 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
|
702 /// 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
|
703 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
|
704 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
|
705 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
|
706 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
707 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
|
708 // 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
|
709 // header. |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
710 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
|
711 // 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
|
712 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
|
713 // 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
|
714 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
|
715 // zstd data. |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
716 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
|
717 // 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
|
718 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
|
719 "unknown compression header '{}'", |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
720 format_type |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
721 ))), |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
722 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
723 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
724 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
725 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
|
726 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
|
727 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
|
728 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
|
729 decoder |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
730 .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
|
731 .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
|
732 Ok(buf) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
733 } else { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
734 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
|
735 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
|
736 decoder |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
737 .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
|
738 .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
|
739 Ok(buf) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
740 } |
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 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
|
744 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
|
745 if self.is_delta() { |
50505
39ed7b2953bb
rust: mostly avoid streaming zstd decompression
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50504
diff
changeset
|
746 // [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
|
747 // 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
|
748 // in the size of the delta. |
39ed7b2953bb
rust: mostly avoid streaming zstd decompression
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50504
diff
changeset
|
749 // 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
|
750 // 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
|
751 // 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
|
752 // 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
|
753 let mut buf = Vec::with_capacity(cap); |
39ed7b2953bb
rust: mostly avoid streaming zstd decompression
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50504
diff
changeset
|
754 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
|
755 Ok(_) => buf.shrink_to_fit(), |
39ed7b2953bb
rust: mostly avoid streaming zstd decompression
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50504
diff
changeset
|
756 Err(_) => { |
39ed7b2953bb
rust: mostly avoid streaming zstd decompression
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50504
diff
changeset
|
757 buf.clear(); |
39ed7b2953bb
rust: mostly avoid streaming zstd decompression
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50504
diff
changeset
|
758 zstd::stream::copy_decode(self.bytes, &mut buf) |
39ed7b2953bb
rust: mostly avoid streaming zstd decompression
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50504
diff
changeset
|
759 .map_err(|e| corrupted(e.to_string()))?; |
39ed7b2953bb
rust: mostly avoid streaming zstd decompression
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50504
diff
changeset
|
760 } |
39ed7b2953bb
rust: mostly avoid streaming zstd decompression
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50504
diff
changeset
|
761 }; |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
762 Ok(buf) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
763 } else { |
50504
d1cab48354bc
rust: in zstd decompression, avoid a useless vec initialization
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50503
diff
changeset
|
764 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
|
765 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
|
766 .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
|
767 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
|
768 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
|
769 } else { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
770 Ok(buf) |
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 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
774 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
775 /// 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
|
776 /// (influences on decompression). |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
777 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
|
778 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
|
779 } |
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 /// 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
|
783 fn hash( |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
784 data: &[u8], |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
785 p1_hash: &[u8], |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
786 p2_hash: &[u8], |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
787 ) -> [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
|
788 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
|
789 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
|
790 if a > b { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
791 hasher.update(b); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
792 hasher.update(a); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
793 } else { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
794 hasher.update(a); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
795 hasher.update(b); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
796 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
797 hasher.update(data); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
798 *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
|
799 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
800 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
801 #[cfg(test)] |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
802 mod tests { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
803 use super::*; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
804 use crate::index::{IndexEntryBuilder, INDEX_ENTRY_SIZE}; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
805 use itertools::Itertools; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
806 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
807 #[test] |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
808 fn test_empty() { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
809 let temp = tempfile::tempdir().unwrap(); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
810 let vfs = Vfs { base: temp.path() }; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
811 std::fs::write(temp.path().join("foo.i"), b"").unwrap(); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
812 let revlog = Revlog::open(&vfs, "foo.i", None, false).unwrap(); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
813 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
|
814 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
|
815 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
|
816 assert!(!revlog.has_rev(0.into())); |
50742
3338c6ffdaa3
rust-revlog: using constant in test
Georges Racinet <georges.racinet@octobus.net>
parents:
50741
diff
changeset
|
817 assert_eq!( |
3338c6ffdaa3
rust-revlog: using constant in test
Georges Racinet <georges.racinet@octobus.net>
parents:
50741
diff
changeset
|
818 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
|
819 NULL_REVISION |
3338c6ffdaa3
rust-revlog: using constant in test
Georges Racinet <georges.racinet@octobus.net>
parents:
50741
diff
changeset
|
820 ); |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
821 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
|
822 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
|
823 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
|
824 } |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
825 |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
826 #[test] |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
827 fn test_inline() { |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
828 let temp = tempfile::tempdir().unwrap(); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
829 let vfs = Vfs { base: temp.path() }; |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
830 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
|
831 .unwrap(); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
832 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
|
833 .unwrap(); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
834 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
|
835 .unwrap(); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
836 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
|
837 .is_first(true) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
838 .with_version(1) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
839 .with_inline(true) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
840 .with_offset(INDEX_ENTRY_SIZE) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
841 .with_node(node0) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
842 .build(); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
843 let entry1_bytes = IndexEntryBuilder::new() |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
844 .with_offset(INDEX_ENTRY_SIZE) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
845 .with_node(node1) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
846 .build(); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
847 let entry2_bytes = IndexEntryBuilder::new() |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
848 .with_offset(INDEX_ENTRY_SIZE) |
50976
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
849 .with_p1(Revision(0)) |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
850 .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
|
851 .with_node(node2) |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
852 .build(); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
853 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
|
854 .into_iter() |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
855 .flatten() |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
856 .collect_vec(); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
857 std::fs::write(temp.path().join("foo.i"), contents).unwrap(); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
858 let revlog = Revlog::open(&vfs, "foo.i", None, false).unwrap(); |
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
859 |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
860 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
|
861 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
|
862 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
|
863 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
|
864 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
|
865 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
|
866 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
|
867 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
|
868 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
|
869 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
|
870 |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
871 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
|
872 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
|
873 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
|
874 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
|
875 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
|
876 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
|
877 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
|
878 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
|
879 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
|
880 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
|
881 |
50974
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50973
diff
changeset
|
882 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
|
883 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
|
884 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
|
885 assert!(entry2.has_p1()); |
50976
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
886 assert_eq!(entry2.p1(), Some(Revision(0))); |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
887 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
|
888 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
|
889 assert!(p1_entry.is_some()); |
50976
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
890 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
|
891 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
|
892 assert!(p2_entry.is_some()); |
50976
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
893 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
|
894 } |
50741
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
895 |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
896 #[test] |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
897 fn test_nodemap() { |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
898 let temp = tempfile::tempdir().unwrap(); |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
899 let vfs = Vfs { base: temp.path() }; |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
900 |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
901 // 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
|
902 // 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
|
903 // 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
|
904 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
|
905 .unwrap(); |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
906 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
|
907 .unwrap(); |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
908 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
|
909 .is_first(true) |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
910 .with_version(1) |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
911 .with_inline(true) |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
912 .with_offset(INDEX_ENTRY_SIZE) |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
913 .with_node(node0) |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
914 .build(); |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
915 let entry1_bytes = IndexEntryBuilder::new() |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
916 .with_offset(INDEX_ENTRY_SIZE) |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
917 .with_node(node1) |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
918 .build(); |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
919 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
|
920 .into_iter() |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
921 .flatten() |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
922 .collect_vec(); |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
923 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
|
924 |
eccf7dc7c91e
revlog: make the rust test for node hex prefix resolution exercise the nodemap
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50982
diff
changeset
|
925 let mut idx = nodemap::tests::TestNtIndex::new(); |
50990
12c308c55e53
branching: merge stable into default
Pierre-Yves David <pierre-yves.david@octobus.net>
diff
changeset
|
926 idx.insert_node(Revision(0), node0).unwrap(); |
12c308c55e53
branching: merge stable into default
Pierre-Yves David <pierre-yves.david@octobus.net>
diff
changeset
|
927 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
|
928 |
eccf7dc7c91e
revlog: make the rust test for node hex prefix resolution exercise the nodemap
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50982
diff
changeset
|
929 let revlog = |
eccf7dc7c91e
revlog: make the rust test for node hex prefix resolution exercise the nodemap
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
50982
diff
changeset
|
930 Revlog::open_gen(&vfs, "foo.i", None, true, Some(idx.nt)).unwrap(); |
50741
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
931 |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
932 // 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
|
933 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
|
934 |
50976
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
935 assert_eq!( |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
936 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
|
937 Revision(-1) |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
938 ); |
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
939 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
|
940 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
|
941 assert_eq!( |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
942 revlog |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
943 .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
|
944 .unwrap(), |
50976
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
945 Revision(-1) |
50741
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
946 ); |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
947 assert_eq!( |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
948 revlog |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
949 .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
|
950 .unwrap(), |
50976
4c5f6e95df84
rust: make `Revision` a newtype
Rapha?l Gom?s <rgomes@octobus.net>
parents:
50975
diff
changeset
|
951 Revision(1) |
50741
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
952 ); |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
953 // 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
|
954 // (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
|
955 match revlog |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
956 .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
|
957 .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
|
958 { |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
959 RevlogError::AmbiguousPrefix => (), |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
960 e => { |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
961 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
|
962 } |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
963 }; |
bca4037306da
rust-revlog: fix incorrect results with NULL_NODE prefixes
Georges Racinet <georges.racinet@octobus.net>
parents:
50740
diff
changeset
|
964 } |
49937
750409505286
rust-clippy: merge "revlog" module definition and struct implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
47961
diff
changeset
|
965 } |