annotate rust/hg-core/src/revlog/revlog.rs @ 49559:7787174f0a5a stable

rhg: fallback when encountering ellipsis revisions Ellipsis revisions are still experimental and buggy in non-trivial histories. We currently have no plans to improve this situation nor to add support for ellipsis revisions in `rhg`. Falling back should be done carefully (since we may have already done some work that is visible to the user), but in this case it's highly unlikely that we're doing anything useful with a repo with ellipsis revisions, so this should be strictly better, also since the error message is more explicit.
author Raphaël Gomès <rgomes@octobus.net>
date Thu, 03 Nov 2022 14:58:58 +0100
parents 6b04f702c501
children c7fb9b74e753
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
1 use std::borrow::Cow;
48543
0a4ac916673e rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents: 48542
diff changeset
2 use std::convert::TryFrom;
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
3 use std::io::Read;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
4 use std::ops::Deref;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
5 use std::path::Path;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
6
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
7 use flate2::read::ZlibDecoder;
47380
fad504cfc94b rust: Use a maintained crate for SHA-1 hashing
Simon Sapin <simon.sapin@octobus.net>
parents: 46821
diff changeset
8 use sha1::{Digest, Sha1};
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
9 use zstd;
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
10
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
11 use super::index::Index;
46431
645ee7225fab rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents: 46390
diff changeset
12 use super::node::{NodePrefix, NODE_BYTES_LENGTH, NULL_NODE};
46090
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
13 use super::nodemap;
46443
43d63979a75e rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents: 46433
diff changeset
14 use super::nodemap::{NodeMap, NodeMapError};
46090
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
15 use super::nodemap_docket::NodeMapDocket;
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
16 use super::patch;
46443
43d63979a75e rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents: 46433
diff changeset
17 use crate::errors::HgError;
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
18 use crate::revlog::Revision;
49089
399439c12223 rust-revlog: make unaware of `Repo`
Martin von Zweigbergk <martinvonz@google.com>
parents: 49087
diff changeset
19 use crate::vfs::Vfs;
47967
6c653d9d41b8 rust: Make private the `index` field of the `Revlog` struct
Simon Sapin <simon.sapin@octobus.net>
parents: 47963
diff changeset
20 use crate::{Node, NULL_REVISION};
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
21
48546
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48544
diff changeset
22 const REVISION_FLAG_CENSORED: u16 = 1 << 15;
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48544
diff changeset
23 const REVISION_FLAG_ELLIPSIS: u16 = 1 << 14;
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48544
diff changeset
24 const REVISION_FLAG_EXTSTORED: u16 = 1 << 13;
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48544
diff changeset
25 const REVISION_FLAG_HASCOPIESINFO: u16 = 1 << 12;
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48544
diff changeset
26
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48544
diff changeset
27 // Keep this in sync with REVIDX_KNOWN_FLAGS in
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48544
diff changeset
28 // mercurial/revlogutils/flagutil.py
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48544
diff changeset
29 const REVIDX_KNOWN_FLAGS: u16 = REVISION_FLAG_CENSORED
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48544
diff changeset
30 | REVISION_FLAG_ELLIPSIS
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48544
diff changeset
31 | REVISION_FLAG_EXTSTORED
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48544
diff changeset
32 | REVISION_FLAG_HASCOPIESINFO;
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48544
diff changeset
33
49210
cc92ad0e8185 rhg: correctly handle the case where diffs are encoded relative to nullrev
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48546
diff changeset
34 const NULL_REVLOG_ENTRY_FLAGS: u16 = 0;
cc92ad0e8185 rhg: correctly handle the case where diffs are encoded relative to nullrev
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48546
diff changeset
35
49094
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
36 #[derive(Debug, derive_more::From)]
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
37 pub enum RevlogError {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
38 InvalidRevision,
46821
e8ae91b1a63d rhg: raise wdir specific error for `hg debugdata`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46744
diff changeset
39 /// Working directory is not supported
e8ae91b1a63d rhg: raise wdir specific error for `hg debugdata`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 46744
diff changeset
40 WDirUnsupported,
46032
8d6164098782 rhg: allow specifying a changeset ID prefix
Simon Sapin <simon-commits@exyr.org>
parents: 45806
diff changeset
41 /// Found more than one entry whose ID match the requested prefix
8d6164098782 rhg: allow specifying a changeset ID prefix
Simon Sapin <simon-commits@exyr.org>
parents: 45806
diff changeset
42 AmbiguousPrefix,
46443
43d63979a75e rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents: 46433
diff changeset
43 #[from]
43d63979a75e rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents: 46433
diff changeset
44 Other(HgError),
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
45 }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
46
46443
43d63979a75e rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents: 46433
diff changeset
47 impl From<NodeMapError> for RevlogError {
43d63979a75e rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents: 46433
diff changeset
48 fn from(error: NodeMapError) -> Self {
43d63979a75e rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents: 46433
diff changeset
49 match error {
43d63979a75e rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents: 46433
diff changeset
50 NodeMapError::MultipleResults => RevlogError::AmbiguousPrefix,
49374
455fce57e89e rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents: 49217
diff changeset
51 NodeMapError::RevisionNotInIndex(rev) => RevlogError::corrupted(
455fce57e89e rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents: 49217
diff changeset
52 format!("nodemap point to revision {} not in index", rev),
455fce57e89e rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents: 49217
diff changeset
53 ),
46443
43d63979a75e rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents: 46433
diff changeset
54 }
43d63979a75e rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents: 46433
diff changeset
55 }
43d63979a75e rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents: 46433
diff changeset
56 }
43d63979a75e rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents: 46433
diff changeset
57
49374
455fce57e89e rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents: 49217
diff changeset
58 fn corrupted<S: AsRef<str>>(context: S) -> HgError {
455fce57e89e rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents: 49217
diff changeset
59 HgError::corrupted(format!("corrupted revlog, {}", context.as_ref()))
48542
35c47015b9b7 rhg: Expose FilelogEntry that wraps RevlogEntry
Simon Sapin <simon.sapin@octobus.net>
parents: 48541
diff changeset
60 }
35c47015b9b7 rhg: Expose FilelogEntry that wraps RevlogEntry
Simon Sapin <simon.sapin@octobus.net>
parents: 48541
diff changeset
61
46443
43d63979a75e rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents: 46433
diff changeset
62 impl RevlogError {
49374
455fce57e89e rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents: 49217
diff changeset
63 fn corrupted<S: AsRef<str>>(context: S) -> Self {
455fce57e89e rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents: 49217
diff changeset
64 RevlogError::Other(corrupted(context))
46390
0800aa42bb4c rust: use the bytes-cast crate to parse persistent nodemaps
Simon Sapin <simon.sapin@octobus.net>
parents: 46167
diff changeset
65 }
0800aa42bb4c rust: use the bytes-cast crate to parse persistent nodemaps
Simon Sapin <simon.sapin@octobus.net>
parents: 46167
diff changeset
66 }
0800aa42bb4c rust: use the bytes-cast crate to parse persistent nodemaps
Simon Sapin <simon.sapin@octobus.net>
parents: 46167
diff changeset
67
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
68 /// Read only implementation of revlog.
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
69 pub struct Revlog {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
70 /// When index and data are not interleaved: bytes of the revlog index.
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
71 /// When index and data are interleaved: bytes of the revlog index and
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
72 /// data.
47967
6c653d9d41b8 rust: Make private the `index` field of the `Revlog` struct
Simon Sapin <simon.sapin@octobus.net>
parents: 47963
diff changeset
73 index: Index,
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
74 /// When index and data are not interleaved: bytes of the revlog data
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
75 data_bytes: Option<Box<dyn Deref<Target = [u8]> + Send>>,
46090
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
76 /// When present on disk: the persistent nodemap for this revlog
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
77 nodemap: Option<nodemap::NodeTree>,
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
78 }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
79
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
80 impl Revlog {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
81 /// Open a revlog index file.
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
82 ///
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
83 /// It will also open the associated data file if index and data are not
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
84 /// interleaved.
45806
7252f5237352 hg-core: fix path encoding usage
Antoine cezar<acezar@chwitlabs.fr>
parents: 45603
diff changeset
85 pub fn open(
49089
399439c12223 rust-revlog: make unaware of `Repo`
Martin von Zweigbergk <martinvonz@google.com>
parents: 49087
diff changeset
86 store_vfs: &Vfs,
46167
8a4914397d02 rust: introduce Repo and Vfs types for filesystem abstraction
Simon Sapin <simon.sapin@octobus.net>
parents: 46090
diff changeset
87 index_path: impl AsRef<Path>,
45806
7252f5237352 hg-core: fix path encoding usage
Antoine cezar<acezar@chwitlabs.fr>
parents: 45603
diff changeset
88 data_path: Option<&Path>,
49087
bfc117647c71 rust-revlog: move check for nodemap requirement to caller
Martin von Zweigbergk <martinvonz@google.com>
parents: 49086
diff changeset
89 use_nodemap: bool,
47963
001d747c2baf rust: Return HgError instead of RevlogError in revlog constructors
Simon Sapin <simon.sapin@octobus.net>
parents: 47962
diff changeset
90 ) -> Result<Self, HgError> {
46167
8a4914397d02 rust: introduce Repo and Vfs types for filesystem abstraction
Simon Sapin <simon.sapin@octobus.net>
parents: 46090
diff changeset
91 let index_path = index_path.as_ref();
48199
9d0e5629cfbf rhg: do not fail when the repo is empty
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48198
diff changeset
92 let index = {
49089
399439c12223 rust-revlog: make unaware of `Repo`
Martin von Zweigbergk <martinvonz@google.com>
parents: 49087
diff changeset
93 match store_vfs.mmap_open_opt(&index_path)? {
48199
9d0e5629cfbf rhg: do not fail when the repo is empty
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48198
diff changeset
94 None => Index::new(Box::new(vec![])),
9d0e5629cfbf rhg: do not fail when the repo is empty
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48198
diff changeset
95 Some(index_mmap) => {
9d0e5629cfbf rhg: do not fail when the repo is empty
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48198
diff changeset
96 let index = Index::new(Box::new(index_mmap))?;
9d0e5629cfbf rhg: do not fail when the repo is empty
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48198
diff changeset
97 Ok(index)
9d0e5629cfbf rhg: do not fail when the repo is empty
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48198
diff changeset
98 }
9d0e5629cfbf rhg: do not fail when the repo is empty
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48198
diff changeset
99 }
9d0e5629cfbf rhg: do not fail when the repo is empty
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48198
diff changeset
100 }?;
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
101
45806
7252f5237352 hg-core: fix path encoding usage
Antoine cezar<acezar@chwitlabs.fr>
parents: 45603
diff changeset
102 let default_data_path = index_path.with_extension("d");
7252f5237352 hg-core: fix path encoding usage
Antoine cezar<acezar@chwitlabs.fr>
parents: 45603
diff changeset
103
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
104 // type annotation required
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
105 // won't recognize Mmap as Deref<Target = [u8]>
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
106 let data_bytes: Option<Box<dyn Deref<Target = [u8]> + Send>> =
45601
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45595
diff changeset
107 if index.is_inline() {
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
108 None
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
109 } else {
45806
7252f5237352 hg-core: fix path encoding usage
Antoine cezar<acezar@chwitlabs.fr>
parents: 45603
diff changeset
110 let data_path = data_path.unwrap_or(&default_data_path);
49089
399439c12223 rust-revlog: make unaware of `Repo`
Martin von Zweigbergk <martinvonz@google.com>
parents: 49087
diff changeset
111 let data_mmap = store_vfs.mmap_open(data_path)?;
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
112 Some(Box::new(data_mmap))
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
113 };
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
114
48226
5e77bdc29d56 rhg: do not try to open a nodemap for an inline index
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48199
diff changeset
115 let nodemap = if index.is_inline() {
5e77bdc29d56 rhg: do not try to open a nodemap for an inline index
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48199
diff changeset
116 None
49087
bfc117647c71 rust-revlog: move check for nodemap requirement to caller
Martin von Zweigbergk <martinvonz@google.com>
parents: 49086
diff changeset
117 } else if !use_nodemap {
49085
07d8d144c222 rust-nodemap-docket: move check of nodemap requirement to caller
Martin von Zweigbergk <martinvonz@google.com>
parents: 49065
diff changeset
118 None
48226
5e77bdc29d56 rhg: do not try to open a nodemap for an inline index
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48199
diff changeset
119 } else {
49089
399439c12223 rust-revlog: make unaware of `Repo`
Martin von Zweigbergk <martinvonz@google.com>
parents: 49087
diff changeset
120 NodeMapDocket::read_from_file(store_vfs, index_path)?.map(
48226
5e77bdc29d56 rhg: do not try to open a nodemap for an inline index
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48199
diff changeset
121 |(docket, data)| {
5e77bdc29d56 rhg: do not try to open a nodemap for an inline index
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48199
diff changeset
122 nodemap::NodeTree::load_bytes(
5e77bdc29d56 rhg: do not try to open a nodemap for an inline index
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48199
diff changeset
123 Box::new(data),
5e77bdc29d56 rhg: do not try to open a nodemap for an inline index
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48199
diff changeset
124 docket.data_length,
5e77bdc29d56 rhg: do not try to open a nodemap for an inline index
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48199
diff changeset
125 )
5e77bdc29d56 rhg: do not try to open a nodemap for an inline index
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48199
diff changeset
126 },
5e77bdc29d56 rhg: do not try to open a nodemap for an inline index
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48199
diff changeset
127 )
5e77bdc29d56 rhg: do not try to open a nodemap for an inline index
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48199
diff changeset
128 };
46090
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
129
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
130 Ok(Revlog {
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
131 index,
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
132 data_bytes,
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
133 nodemap,
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
134 })
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
135 }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
136
45534
4f11a67a12fb hg-core: add `Revlog.get_node_rev`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45531
diff changeset
137 /// Return number of entries of the `Revlog`.
4f11a67a12fb hg-core: add `Revlog.get_node_rev`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45531
diff changeset
138 pub fn len(&self) -> usize {
45601
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45595
diff changeset
139 self.index.len()
45534
4f11a67a12fb hg-core: add `Revlog.get_node_rev`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45531
diff changeset
140 }
4f11a67a12fb hg-core: add `Revlog.get_node_rev`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45531
diff changeset
141
4f11a67a12fb hg-core: add `Revlog.get_node_rev`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45531
diff changeset
142 /// Returns `true` if the `Revlog` has zero `entries`.
4f11a67a12fb hg-core: add `Revlog.get_node_rev`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45531
diff changeset
143 pub fn is_empty(&self) -> bool {
45601
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45595
diff changeset
144 self.index.is_empty()
45534
4f11a67a12fb hg-core: add `Revlog.get_node_rev`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45531
diff changeset
145 }
4f11a67a12fb hg-core: add `Revlog.get_node_rev`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45531
diff changeset
146
47969
87e3f878e65f rust: Rename get_node methods to data_for_node, get_rev to data_for_rev
Simon Sapin <simon.sapin@octobus.net>
parents: 47968
diff changeset
147 /// Returns the node ID for the given revision number, if it exists in this
87e3f878e65f rust: Rename get_node methods to data_for_node, get_rev to data_for_rev
Simon Sapin <simon.sapin@octobus.net>
parents: 47968
diff changeset
148 /// revlog
47967
6c653d9d41b8 rust: Make private the `index` field of the `Revlog` struct
Simon Sapin <simon.sapin@octobus.net>
parents: 47963
diff changeset
149 pub fn node_from_rev(&self, rev: Revision) -> Option<&Node> {
48236
f8dc78716ad2 rhg: fix `hg cat` interaction with null revision
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48227
diff changeset
150 if rev == NULL_REVISION {
f8dc78716ad2 rhg: fix `hg cat` interaction with null revision
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48227
diff changeset
151 return Some(&NULL_NODE);
f8dc78716ad2 rhg: fix `hg cat` interaction with null revision
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48227
diff changeset
152 }
47967
6c653d9d41b8 rust: Make private the `index` field of the `Revlog` struct
Simon Sapin <simon.sapin@octobus.net>
parents: 47963
diff changeset
153 Some(self.index.get_entry(rev)?.hash())
6c653d9d41b8 rust: Make private the `index` field of the `Revlog` struct
Simon Sapin <simon.sapin@octobus.net>
parents: 47963
diff changeset
154 }
6c653d9d41b8 rust: Make private the `index` field of the `Revlog` struct
Simon Sapin <simon.sapin@octobus.net>
parents: 47963
diff changeset
155
47969
87e3f878e65f rust: Rename get_node methods to data_for_node, get_rev to data_for_rev
Simon Sapin <simon.sapin@octobus.net>
parents: 47968
diff changeset
156 /// Return the revision number for the given node ID, if it exists in this
87e3f878e65f rust: Rename get_node methods to data_for_node, get_rev to data_for_rev
Simon Sapin <simon.sapin@octobus.net>
parents: 47968
diff changeset
157 /// revlog
47968
6f579618ea7b rust: Rename the `Revlog::get_node_rev` method to `rev_from_node`
Simon Sapin <simon.sapin@octobus.net>
parents: 47967
diff changeset
158 pub fn rev_from_node(
46033
88e741bf2d93 rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents: 46032
diff changeset
159 &self,
46431
645ee7225fab rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef
Simon Sapin <simon.sapin@octobus.net>
parents: 46390
diff changeset
160 node: NodePrefix,
46033
88e741bf2d93 rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents: 46032
diff changeset
161 ) -> Result<Revision, RevlogError> {
47962
8c29af0f6d6e rhg: Align with Python on some revset parsing corner cases
Simon Sapin <simon.sapin@octobus.net>
parents: 47380
diff changeset
162 if node.is_prefix_of(&NULL_NODE) {
8c29af0f6d6e rhg: Align with Python on some revset parsing corner cases
Simon Sapin <simon.sapin@octobus.net>
parents: 47380
diff changeset
163 return Ok(NULL_REVISION);
8c29af0f6d6e rhg: Align with Python on some revset parsing corner cases
Simon Sapin <simon.sapin@octobus.net>
parents: 47380
diff changeset
164 }
8c29af0f6d6e rhg: Align with Python on some revset parsing corner cases
Simon Sapin <simon.sapin@octobus.net>
parents: 47380
diff changeset
165
46090
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
166 if let Some(nodemap) = &self.nodemap {
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
167 return nodemap
46443
43d63979a75e rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents: 46433
diff changeset
168 .find_bin(&self.index, node)?
46090
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
169 .ok_or(RevlogError::InvalidRevision);
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
170 }
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
171
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
172 // Fallback to linear scan when a persistent nodemap is not present.
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
173 // This happens when the persistent-nodemap experimental feature is not
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
174 // enabled, or for small revlogs.
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
175 //
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
176 // TODO: consider building a non-persistent nodemap in memory to
9eb07ab3f2d4 rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents: 46033
diff changeset
177 // optimize these cases.
46032
8d6164098782 rhg: allow specifying a changeset ID prefix
Simon Sapin <simon-commits@exyr.org>
parents: 45806
diff changeset
178 let mut found_by_prefix = None;
45534
4f11a67a12fb hg-core: add `Revlog.get_node_rev`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45531
diff changeset
179 for rev in (0..self.len() as Revision).rev() {
4f11a67a12fb hg-core: add `Revlog.get_node_rev`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45531
diff changeset
180 let index_entry =
46443
43d63979a75e rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents: 46433
diff changeset
181 self.index.get_entry(rev).ok_or(HgError::corrupted(
43d63979a75e rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents: 46433
diff changeset
182 "revlog references a revision not in the index",
43d63979a75e rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents: 46433
diff changeset
183 ))?;
46033
88e741bf2d93 rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents: 46032
diff changeset
184 if node == *index_entry.hash() {
45534
4f11a67a12fb hg-core: add `Revlog.get_node_rev`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45531
diff changeset
185 return Ok(rev);
4f11a67a12fb hg-core: add `Revlog.get_node_rev`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45531
diff changeset
186 }
46033
88e741bf2d93 rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents: 46032
diff changeset
187 if node.is_prefix_of(index_entry.hash()) {
46032
8d6164098782 rhg: allow specifying a changeset ID prefix
Simon Sapin <simon-commits@exyr.org>
parents: 45806
diff changeset
188 if found_by_prefix.is_some() {
8d6164098782 rhg: allow specifying a changeset ID prefix
Simon Sapin <simon-commits@exyr.org>
parents: 45806
diff changeset
189 return Err(RevlogError::AmbiguousPrefix);
8d6164098782 rhg: allow specifying a changeset ID prefix
Simon Sapin <simon-commits@exyr.org>
parents: 45806
diff changeset
190 }
8d6164098782 rhg: allow specifying a changeset ID prefix
Simon Sapin <simon-commits@exyr.org>
parents: 45806
diff changeset
191 found_by_prefix = Some(rev)
8d6164098782 rhg: allow specifying a changeset ID prefix
Simon Sapin <simon-commits@exyr.org>
parents: 45806
diff changeset
192 }
45534
4f11a67a12fb hg-core: add `Revlog.get_node_rev`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45531
diff changeset
193 }
46032
8d6164098782 rhg: allow specifying a changeset ID prefix
Simon Sapin <simon-commits@exyr.org>
parents: 45806
diff changeset
194 found_by_prefix.ok_or(RevlogError::InvalidRevision)
45534
4f11a67a12fb hg-core: add `Revlog.get_node_rev`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45531
diff changeset
195 }
4f11a67a12fb hg-core: add `Revlog.get_node_rev`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45531
diff changeset
196
46433
4b381dbbf8b7 rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents: 46431
diff changeset
197 /// Returns whether the given revision exists in this revlog.
4b381dbbf8b7 rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents: 46431
diff changeset
198 pub fn has_rev(&self, rev: Revision) -> bool {
4b381dbbf8b7 rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents: 46431
diff changeset
199 self.index.get_entry(rev).is_some()
4b381dbbf8b7 rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents: 46431
diff changeset
200 }
4b381dbbf8b7 rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents: 46431
diff changeset
201
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
202 /// Return the full data associated to a revision.
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
203 ///
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
204 /// All entries required to build the final data out of deltas will be
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
205 /// retrieved as needed, and the deltas will be applied to the inital
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
206 /// snapshot to rebuild the final data.
48541
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
207 pub fn get_rev_data(
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
208 &self,
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
209 rev: Revision,
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
210 ) -> Result<Cow<[u8]>, RevlogError> {
48198
61ce70fd420e rhg: handle null changelog and manifest revisions
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48083
diff changeset
211 if rev == NULL_REVISION {
48541
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
212 return Ok(Cow::Borrowed(&[]));
48198
61ce70fd420e rhg: handle null changelog and manifest revisions
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48083
diff changeset
213 };
48542
35c47015b9b7 rhg: Expose FilelogEntry that wraps RevlogEntry
Simon Sapin <simon.sapin@octobus.net>
parents: 48541
diff changeset
214 Ok(self.get_entry(rev)?.data()?)
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
215 }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
216
45531
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
217 /// Check the hash of some given data against the recorded hash.
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
218 pub fn check_hash(
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
219 &self,
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
220 p1: Revision,
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
221 p2: Revision,
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
222 expected: &[u8],
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
223 data: &[u8],
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
224 ) -> bool {
45601
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45595
diff changeset
225 let e1 = self.index.get_entry(p1);
45531
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
226 let h1 = match e1 {
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
227 Some(ref entry) => entry.hash(),
46033
88e741bf2d93 rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents: 46032
diff changeset
228 None => &NULL_NODE,
45531
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
229 };
45601
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45595
diff changeset
230 let e2 = self.index.get_entry(p2);
45531
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
231 let h2 = match e2 {
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
232 Some(ref entry) => entry.hash(),
46033
88e741bf2d93 rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents: 46032
diff changeset
233 None => &NULL_NODE,
45531
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
234 };
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
235
47380
fad504cfc94b rust: Use a maintained crate for SHA-1 hashing
Simon Sapin <simon.sapin@octobus.net>
parents: 46821
diff changeset
236 &hash(data, h1.as_bytes(), h2.as_bytes()) == expected
45531
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
237 }
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
238
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
239 /// Build the full data of a revision out its snapshot
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
240 /// and its deltas.
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
241 fn build_data_from_deltas(
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
242 snapshot: RevlogEntry,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
243 deltas: &[RevlogEntry],
48542
35c47015b9b7 rhg: Expose FilelogEntry that wraps RevlogEntry
Simon Sapin <simon.sapin@octobus.net>
parents: 48541
diff changeset
244 ) -> Result<Vec<u8>, HgError> {
48540
20d0d896183e rhg: Rename some revlog-related types and methods
Simon Sapin <simon.sapin@octobus.net>
parents: 48458
diff changeset
245 let snapshot = snapshot.data_chunk()?;
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
246 let deltas = deltas
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
247 .iter()
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
248 .rev()
48540
20d0d896183e rhg: Rename some revlog-related types and methods
Simon Sapin <simon.sapin@octobus.net>
parents: 48458
diff changeset
249 .map(RevlogEntry::data_chunk)
48542
35c47015b9b7 rhg: Expose FilelogEntry that wraps RevlogEntry
Simon Sapin <simon.sapin@octobus.net>
parents: 48541
diff changeset
250 .collect::<Result<Vec<_>, _>>()?;
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
251 let patches: Vec<_> =
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
252 deltas.iter().map(|d| patch::PatchList::new(d)).collect();
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
253 let patch = patch::fold_patch_lists(&patches);
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
254 Ok(patch.apply(&snapshot))
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
255 }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
256
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
257 /// Return the revlog data.
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
258 fn data(&self) -> &[u8] {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
259 match self.data_bytes {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
260 Some(ref data_bytes) => &data_bytes,
45601
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45595
diff changeset
261 None => panic!(
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45595
diff changeset
262 "forgot to load the data or trying to access inline data"
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45595
diff changeset
263 ),
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
264 }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
265 }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
266
49210
cc92ad0e8185 rhg: correctly handle the case where diffs are encoded relative to nullrev
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48546
diff changeset
267 pub fn make_null_entry(&self) -> RevlogEntry {
cc92ad0e8185 rhg: correctly handle the case where diffs are encoded relative to nullrev
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48546
diff changeset
268 RevlogEntry {
cc92ad0e8185 rhg: correctly handle the case where diffs are encoded relative to nullrev
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48546
diff changeset
269 revlog: self,
cc92ad0e8185 rhg: correctly handle the case where diffs are encoded relative to nullrev
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48546
diff changeset
270 rev: NULL_REVISION,
cc92ad0e8185 rhg: correctly handle the case where diffs are encoded relative to nullrev
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48546
diff changeset
271 bytes: b"",
cc92ad0e8185 rhg: correctly handle the case where diffs are encoded relative to nullrev
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48546
diff changeset
272 compressed_len: 0,
cc92ad0e8185 rhg: correctly handle the case where diffs are encoded relative to nullrev
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48546
diff changeset
273 uncompressed_len: 0,
cc92ad0e8185 rhg: correctly handle the case where diffs are encoded relative to nullrev
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48546
diff changeset
274 base_rev_or_base_of_delta_chain: None,
cc92ad0e8185 rhg: correctly handle the case where diffs are encoded relative to nullrev
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48546
diff changeset
275 p1: NULL_REVISION,
cc92ad0e8185 rhg: correctly handle the case where diffs are encoded relative to nullrev
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48546
diff changeset
276 p2: NULL_REVISION,
cc92ad0e8185 rhg: correctly handle the case where diffs are encoded relative to nullrev
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48546
diff changeset
277 flags: NULL_REVLOG_ENTRY_FLAGS,
cc92ad0e8185 rhg: correctly handle the case where diffs are encoded relative to nullrev
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48546
diff changeset
278 hash: NULL_NODE,
cc92ad0e8185 rhg: correctly handle the case where diffs are encoded relative to nullrev
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48546
diff changeset
279 }
cc92ad0e8185 rhg: correctly handle the case where diffs are encoded relative to nullrev
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48546
diff changeset
280 }
cc92ad0e8185 rhg: correctly handle the case where diffs are encoded relative to nullrev
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48546
diff changeset
281
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
282 /// Get an entry of the revlog.
48542
35c47015b9b7 rhg: Expose FilelogEntry that wraps RevlogEntry
Simon Sapin <simon.sapin@octobus.net>
parents: 48541
diff changeset
283 pub fn get_entry(
35c47015b9b7 rhg: Expose FilelogEntry that wraps RevlogEntry
Simon Sapin <simon.sapin@octobus.net>
parents: 48541
diff changeset
284 &self,
35c47015b9b7 rhg: Expose FilelogEntry that wraps RevlogEntry
Simon Sapin <simon.sapin@octobus.net>
parents: 48541
diff changeset
285 rev: Revision,
35c47015b9b7 rhg: Expose FilelogEntry that wraps RevlogEntry
Simon Sapin <simon.sapin@octobus.net>
parents: 48541
diff changeset
286 ) -> Result<RevlogEntry, RevlogError> {
49210
cc92ad0e8185 rhg: correctly handle the case where diffs are encoded relative to nullrev
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48546
diff changeset
287 if rev == NULL_REVISION {
cc92ad0e8185 rhg: correctly handle the case where diffs are encoded relative to nullrev
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48546
diff changeset
288 return Ok(self.make_null_entry());
cc92ad0e8185 rhg: correctly handle the case where diffs are encoded relative to nullrev
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48546
diff changeset
289 }
45601
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45595
diff changeset
290 let index_entry = self
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45595
diff changeset
291 .index
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45595
diff changeset
292 .get_entry(rev)
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45595
diff changeset
293 .ok_or(RevlogError::InvalidRevision)?;
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
294 let start = index_entry.offset();
48543
0a4ac916673e rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents: 48542
diff changeset
295 let end = start + index_entry.compressed_len() as usize;
45601
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45595
diff changeset
296 let data = if self.index.is_inline() {
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45595
diff changeset
297 self.index.data(start, end)
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45595
diff changeset
298 } else {
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45595
diff changeset
299 &self.data()[start..end]
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45595
diff changeset
300 };
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
301 let entry = RevlogEntry {
48541
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
302 revlog: self,
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
303 rev,
45601
900b9b79b99c hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45595
diff changeset
304 bytes: data,
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
305 compressed_len: index_entry.compressed_len(),
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
306 uncompressed_len: index_entry.uncompressed_len(),
48458
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
307 base_rev_or_base_of_delta_chain: if index_entry
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
308 .base_revision_or_base_of_delta_chain()
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
309 == rev
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
310 {
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
311 None
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
312 } else {
48458
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
313 Some(index_entry.base_revision_or_base_of_delta_chain())
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
314 },
48544
faa243f345cc rhg: Store p1, p2, and hash in RevlogEntry
Simon Sapin <simon.sapin@octobus.net>
parents: 48543
diff changeset
315 p1: index_entry.p1(),
faa243f345cc rhg: Store p1, p2, and hash in RevlogEntry
Simon Sapin <simon.sapin@octobus.net>
parents: 48543
diff changeset
316 p2: index_entry.p2(),
48546
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48544
diff changeset
317 flags: index_entry.flags(),
48544
faa243f345cc rhg: Store p1, p2, and hash in RevlogEntry
Simon Sapin <simon.sapin@octobus.net>
parents: 48543
diff changeset
318 hash: *index_entry.hash(),
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
319 };
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
320 Ok(entry)
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
321 }
48458
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
322
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
323 /// when resolving internal references within revlog, any errors
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
324 /// should be reported as corruption, instead of e.g. "invalid revision"
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
325 fn get_entry_internal(
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
326 &self,
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
327 rev: Revision,
48542
35c47015b9b7 rhg: Expose FilelogEntry that wraps RevlogEntry
Simon Sapin <simon.sapin@octobus.net>
parents: 48541
diff changeset
328 ) -> Result<RevlogEntry, HgError> {
49374
455fce57e89e rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents: 49217
diff changeset
329 self.get_entry(rev)
455fce57e89e rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents: 49217
diff changeset
330 .map_err(|_| corrupted(format!("revision {} out of range", rev)))
48458
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
331 }
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
332 }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
333
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
334 /// The revlog entry's bytes and the necessary informations to extract
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
335 /// the entry's data.
48541
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
336 #[derive(Clone)]
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
337 pub struct RevlogEntry<'a> {
48541
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
338 revlog: &'a Revlog,
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
339 rev: Revision,
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
340 bytes: &'a [u8],
48543
0a4ac916673e rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents: 48542
diff changeset
341 compressed_len: u32,
0a4ac916673e rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents: 48542
diff changeset
342 uncompressed_len: i32,
48458
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
343 base_rev_or_base_of_delta_chain: Option<Revision>,
48544
faa243f345cc rhg: Store p1, p2, and hash in RevlogEntry
Simon Sapin <simon.sapin@octobus.net>
parents: 48543
diff changeset
344 p1: Revision,
faa243f345cc rhg: Store p1, p2, and hash in RevlogEntry
Simon Sapin <simon.sapin@octobus.net>
parents: 48543
diff changeset
345 p2: Revision,
48546
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48544
diff changeset
346 flags: u16,
48544
faa243f345cc rhg: Store p1, p2, and hash in RevlogEntry
Simon Sapin <simon.sapin@octobus.net>
parents: 48543
diff changeset
347 hash: Node,
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
348 }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
349
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
350 impl<'a> RevlogEntry<'a> {
48083
fecfea658127 hg-core: silence dead-code warning by adding RevlogEntry::revion() accessor
Martin von Zweigbergk <martinvonz@google.com>
parents: 47969
diff changeset
351 pub fn revision(&self) -> Revision {
fecfea658127 hg-core: silence dead-code warning by adding RevlogEntry::revion() accessor
Martin von Zweigbergk <martinvonz@google.com>
parents: 47969
diff changeset
352 self.rev
fecfea658127 hg-core: silence dead-code warning by adding RevlogEntry::revion() accessor
Martin von Zweigbergk <martinvonz@google.com>
parents: 47969
diff changeset
353 }
fecfea658127 hg-core: silence dead-code warning by adding RevlogEntry::revion() accessor
Martin von Zweigbergk <martinvonz@google.com>
parents: 47969
diff changeset
354
49065
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
355 pub fn node(&self) -> &Node {
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
356 &self.hash
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
357 }
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
358
48543
0a4ac916673e rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents: 48542
diff changeset
359 pub fn uncompressed_len(&self) -> Option<u32> {
0a4ac916673e rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents: 48542
diff changeset
360 u32::try_from(self.uncompressed_len).ok()
0a4ac916673e rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents: 48542
diff changeset
361 }
0a4ac916673e rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents: 48542
diff changeset
362
48546
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48544
diff changeset
363 pub fn has_p1(&self) -> bool {
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48544
diff changeset
364 self.p1 != NULL_REVISION
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48544
diff changeset
365 }
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48544
diff changeset
366
49065
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
367 pub fn p1_entry(&self) -> Result<Option<RevlogEntry>, RevlogError> {
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
368 if self.p1 == NULL_REVISION {
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
369 Ok(None)
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
370 } else {
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
371 Ok(Some(self.revlog.get_entry(self.p1)?))
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
372 }
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
373 }
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
374
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
375 pub fn p2_entry(&self) -> Result<Option<RevlogEntry>, RevlogError> {
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
376 if self.p2 == NULL_REVISION {
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
377 Ok(None)
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
378 } else {
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
379 Ok(Some(self.revlog.get_entry(self.p2)?))
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
380 }
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
381 }
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
382
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
383 pub fn p1(&self) -> Option<Revision> {
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
384 if self.p1 == NULL_REVISION {
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
385 None
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
386 } else {
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
387 Some(self.p1)
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
388 }
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
389 }
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
390
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
391 pub fn p2(&self) -> Option<Revision> {
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
392 if self.p2 == NULL_REVISION {
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
393 None
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
394 } else {
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
395 Some(self.p2)
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
396 }
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
397 }
5d205e476057 rust-revlog: add methods for getting parent revs and entries
Martin von Zweigbergk <martinvonz@google.com>
parents: 48546
diff changeset
398
49174
3f86ee422095 censor: make rhg fall back to python when encountering a censored node
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49094
diff changeset
399 pub fn is_censored(&self) -> bool {
48546
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48544
diff changeset
400 (self.flags & REVISION_FLAG_CENSORED) != 0
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48544
diff changeset
401 }
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48544
diff changeset
402
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48544
diff changeset
403 pub fn has_length_affecting_flag_processor(&self) -> bool {
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48544
diff changeset
404 // Relevant Python code: revlog.size()
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48544
diff changeset
405 // note: ELLIPSIS is known to not change the content
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48544
diff changeset
406 (self.flags & (REVIDX_KNOWN_FLAGS ^ REVISION_FLAG_ELLIPSIS)) != 0
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48544
diff changeset
407 }
e91aa800ae5b rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents: 48544
diff changeset
408
48541
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
409 /// The data for this entry, after resolving deltas if any.
49174
3f86ee422095 censor: make rhg fall back to python when encountering a censored node
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49094
diff changeset
410 pub fn rawdata(&self) -> Result<Cow<'a, [u8]>, HgError> {
48541
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
411 let mut entry = self.clone();
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
412 let mut delta_chain = vec![];
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
413
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
414 // The meaning of `base_rev_or_base_of_delta_chain` depends on
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
415 // generaldelta. See the doc on `ENTRY_DELTA_BASE` in
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
416 // `mercurial/revlogutils/constants.py` and the code in
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
417 // [_chaininfo] and in [index_deltachain].
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
418 let uses_generaldelta = self.revlog.index.uses_generaldelta();
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
419 while let Some(base_rev) = entry.base_rev_or_base_of_delta_chain {
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
420 let base_rev = if uses_generaldelta {
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
421 base_rev
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
422 } else {
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
423 entry.rev - 1
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
424 };
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
425 delta_chain.push(entry);
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
426 entry = self.revlog.get_entry_internal(base_rev)?;
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
427 }
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
428
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
429 let data = if delta_chain.is_empty() {
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
430 entry.data_chunk()?
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
431 } else {
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
432 Revlog::build_data_from_deltas(entry, &delta_chain)?.into()
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
433 };
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
434
49174
3f86ee422095 censor: make rhg fall back to python when encountering a censored node
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49094
diff changeset
435 Ok(data)
3f86ee422095 censor: make rhg fall back to python when encountering a censored node
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49094
diff changeset
436 }
3f86ee422095 censor: make rhg fall back to python when encountering a censored node
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49094
diff changeset
437
3f86ee422095 censor: make rhg fall back to python when encountering a censored node
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49094
diff changeset
438 fn check_data(
3f86ee422095 censor: make rhg fall back to python when encountering a censored node
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49094
diff changeset
439 &self,
3f86ee422095 censor: make rhg fall back to python when encountering a censored node
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49094
diff changeset
440 data: Cow<'a, [u8]>,
3f86ee422095 censor: make rhg fall back to python when encountering a censored node
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49094
diff changeset
441 ) -> Result<Cow<'a, [u8]>, HgError> {
48541
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
442 if self.revlog.check_hash(
48544
faa243f345cc rhg: Store p1, p2, and hash in RevlogEntry
Simon Sapin <simon.sapin@octobus.net>
parents: 48543
diff changeset
443 self.p1,
faa243f345cc rhg: Store p1, p2, and hash in RevlogEntry
Simon Sapin <simon.sapin@octobus.net>
parents: 48543
diff changeset
444 self.p2,
faa243f345cc rhg: Store p1, p2, and hash in RevlogEntry
Simon Sapin <simon.sapin@octobus.net>
parents: 48543
diff changeset
445 self.hash.as_bytes(),
48541
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
446 &data,
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
447 ) {
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
448 Ok(data)
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
449 } else {
49559
7787174f0a5a rhg: fallback when encountering ellipsis revisions
Raphaël Gomès <rgomes@octobus.net>
parents: 49376
diff changeset
450 if (self.flags & REVISION_FLAG_ELLIPSIS) != 0 {
7787174f0a5a rhg: fallback when encountering ellipsis revisions
Raphaël Gomès <rgomes@octobus.net>
parents: 49376
diff changeset
451 return Err(HgError::unsupported(
7787174f0a5a rhg: fallback when encountering ellipsis revisions
Raphaël Gomès <rgomes@octobus.net>
parents: 49376
diff changeset
452 "ellipsis revisions are not supported by rhg",
7787174f0a5a rhg: fallback when encountering ellipsis revisions
Raphaël Gomès <rgomes@octobus.net>
parents: 49376
diff changeset
453 ));
7787174f0a5a rhg: fallback when encountering ellipsis revisions
Raphaël Gomès <rgomes@octobus.net>
parents: 49376
diff changeset
454 }
49374
455fce57e89e rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents: 49217
diff changeset
455 Err(corrupted(format!(
455fce57e89e rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents: 49217
diff changeset
456 "hash check failed for revision {}",
455fce57e89e rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents: 49217
diff changeset
457 self.rev
455fce57e89e rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents: 49217
diff changeset
458 )))
48541
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
459 }
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
460 }
f2f57724d4eb rhg: Add RevlogEntry::data that does delta resolution
Simon Sapin <simon.sapin@octobus.net>
parents: 48540
diff changeset
461
49174
3f86ee422095 censor: make rhg fall back to python when encountering a censored node
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49094
diff changeset
462 pub fn data(&self) -> Result<Cow<'a, [u8]>, HgError> {
3f86ee422095 censor: make rhg fall back to python when encountering a censored node
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49094
diff changeset
463 let data = self.rawdata()?;
3f86ee422095 censor: make rhg fall back to python when encountering a censored node
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49094
diff changeset
464 if self.is_censored() {
3f86ee422095 censor: make rhg fall back to python when encountering a censored node
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49094
diff changeset
465 return Err(HgError::CensoredNodeError);
3f86ee422095 censor: make rhg fall back to python when encountering a censored node
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49094
diff changeset
466 }
3f86ee422095 censor: make rhg fall back to python when encountering a censored node
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49094
diff changeset
467 self.check_data(data)
3f86ee422095 censor: make rhg fall back to python when encountering a censored node
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49094
diff changeset
468 }
3f86ee422095 censor: make rhg fall back to python when encountering a censored node
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 49094
diff changeset
469
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
470 /// Extract the data contained in the entry.
48540
20d0d896183e rhg: Rename some revlog-related types and methods
Simon Sapin <simon.sapin@octobus.net>
parents: 48458
diff changeset
471 /// This may be a delta. (See `is_delta`.)
48542
35c47015b9b7 rhg: Expose FilelogEntry that wraps RevlogEntry
Simon Sapin <simon.sapin@octobus.net>
parents: 48541
diff changeset
472 fn data_chunk(&self) -> Result<Cow<'a, [u8]>, HgError> {
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
473 if self.bytes.is_empty() {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
474 return Ok(Cow::Borrowed(&[]));
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
475 }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
476 match self.bytes[0] {
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
477 // Revision data is the entirety of the entry, including this
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
478 // header.
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
479 b'\0' => Ok(Cow::Borrowed(self.bytes)),
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
480 // Raw revision data follows.
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
481 b'u' => Ok(Cow::Borrowed(&self.bytes[1..])),
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
482 // zlib (RFC 1950) data.
45595
497657895b54 hg-core: return `Err` on decompression error (D8958#inline-15004 followup)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45536
diff changeset
483 b'x' => Ok(Cow::Owned(self.uncompressed_zlib_data()?)),
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
484 // zstd data.
45595
497657895b54 hg-core: return `Err` on decompression error (D8958#inline-15004 followup)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45536
diff changeset
485 b'\x28' => Ok(Cow::Owned(self.uncompressed_zstd_data()?)),
46443
43d63979a75e rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents: 46433
diff changeset
486 // A proper new format should have had a repo/store requirement.
49374
455fce57e89e rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents: 49217
diff changeset
487 format_type => Err(corrupted(format!(
455fce57e89e rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents: 49217
diff changeset
488 "unknown compression header '{}'",
455fce57e89e rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents: 49217
diff changeset
489 format_type
455fce57e89e rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents: 49217
diff changeset
490 ))),
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
491 }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
492 }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
493
48542
35c47015b9b7 rhg: Expose FilelogEntry that wraps RevlogEntry
Simon Sapin <simon.sapin@octobus.net>
parents: 48541
diff changeset
494 fn uncompressed_zlib_data(&self) -> Result<Vec<u8>, HgError> {
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
495 let mut decoder = ZlibDecoder::new(self.bytes);
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
496 if self.is_delta() {
48543
0a4ac916673e rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents: 48542
diff changeset
497 let mut buf = Vec::with_capacity(self.compressed_len as usize);
49374
455fce57e89e rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents: 49217
diff changeset
498 decoder
455fce57e89e rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents: 49217
diff changeset
499 .read_to_end(&mut buf)
455fce57e89e rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents: 49217
diff changeset
500 .map_err(|e| corrupted(e.to_string()))?;
45595
497657895b54 hg-core: return `Err` on decompression error (D8958#inline-15004 followup)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45536
diff changeset
501 Ok(buf)
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
502 } else {
48543
0a4ac916673e rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents: 48542
diff changeset
503 let cap = self.uncompressed_len.max(0) as usize;
0a4ac916673e rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents: 48542
diff changeset
504 let mut buf = vec![0; cap];
49374
455fce57e89e rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents: 49217
diff changeset
505 decoder
455fce57e89e rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents: 49217
diff changeset
506 .read_exact(&mut buf)
455fce57e89e rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents: 49217
diff changeset
507 .map_err(|e| corrupted(e.to_string()))?;
45595
497657895b54 hg-core: return `Err` on decompression error (D8958#inline-15004 followup)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45536
diff changeset
508 Ok(buf)
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
509 }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
510 }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
511
48542
35c47015b9b7 rhg: Expose FilelogEntry that wraps RevlogEntry
Simon Sapin <simon.sapin@octobus.net>
parents: 48541
diff changeset
512 fn uncompressed_zstd_data(&self) -> Result<Vec<u8>, HgError> {
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
513 if self.is_delta() {
48543
0a4ac916673e rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents: 48542
diff changeset
514 let mut buf = Vec::with_capacity(self.compressed_len as usize);
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
515 zstd::stream::copy_decode(self.bytes, &mut buf)
49374
455fce57e89e rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents: 49217
diff changeset
516 .map_err(|e| corrupted(e.to_string()))?;
45595
497657895b54 hg-core: return `Err` on decompression error (D8958#inline-15004 followup)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45536
diff changeset
517 Ok(buf)
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
518 } else {
48543
0a4ac916673e rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents: 48542
diff changeset
519 let cap = self.uncompressed_len.max(0) as usize;
0a4ac916673e rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents: 48542
diff changeset
520 let mut buf = vec![0; cap];
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
521 let len = zstd::block::decompress_to_buffer(self.bytes, &mut buf)
49374
455fce57e89e rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents: 49217
diff changeset
522 .map_err(|e| corrupted(e.to_string()))?;
48543
0a4ac916673e rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents: 48542
diff changeset
523 if len != self.uncompressed_len as usize {
49374
455fce57e89e rust: don't swallow valuable error information
Raphaël Gomès <rgomes@octobus.net>
parents: 49217
diff changeset
524 Err(corrupted("uncompressed length does not match"))
45595
497657895b54 hg-core: return `Err` on decompression error (D8958#inline-15004 followup)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45536
diff changeset
525 } else {
497657895b54 hg-core: return `Err` on decompression error (D8958#inline-15004 followup)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45536
diff changeset
526 Ok(buf)
497657895b54 hg-core: return `Err` on decompression error (D8958#inline-15004 followup)
Antoine cezar<acezar@chwitlabs.fr>
parents: 45536
diff changeset
527 }
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
528 }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
529 }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
530
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
531 /// Tell if the entry is a snapshot or a delta
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
532 /// (influences on decompression).
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
533 fn is_delta(&self) -> bool {
48458
96ea4db4741b rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 48457
diff changeset
534 self.base_rev_or_base_of_delta_chain.is_some()
45526
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
535 }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
536 }
26c53ee51c68 hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff changeset
537
45531
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
538 /// Calculate the hash of a revision given its data and its parents.
47380
fad504cfc94b rust: Use a maintained crate for SHA-1 hashing
Simon Sapin <simon.sapin@octobus.net>
parents: 46821
diff changeset
539 fn hash(
fad504cfc94b rust: Use a maintained crate for SHA-1 hashing
Simon Sapin <simon.sapin@octobus.net>
parents: 46821
diff changeset
540 data: &[u8],
fad504cfc94b rust: Use a maintained crate for SHA-1 hashing
Simon Sapin <simon.sapin@octobus.net>
parents: 46821
diff changeset
541 p1_hash: &[u8],
fad504cfc94b rust: Use a maintained crate for SHA-1 hashing
Simon Sapin <simon.sapin@octobus.net>
parents: 46821
diff changeset
542 p2_hash: &[u8],
fad504cfc94b rust: Use a maintained crate for SHA-1 hashing
Simon Sapin <simon.sapin@octobus.net>
parents: 46821
diff changeset
543 ) -> [u8; NODE_BYTES_LENGTH] {
45531
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
544 let mut hasher = Sha1::new();
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
545 let (a, b) = (p1_hash, p2_hash);
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
546 if a > b {
47380
fad504cfc94b rust: Use a maintained crate for SHA-1 hashing
Simon Sapin <simon.sapin@octobus.net>
parents: 46821
diff changeset
547 hasher.update(b);
fad504cfc94b rust: Use a maintained crate for SHA-1 hashing
Simon Sapin <simon.sapin@octobus.net>
parents: 46821
diff changeset
548 hasher.update(a);
45531
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
549 } else {
47380
fad504cfc94b rust: Use a maintained crate for SHA-1 hashing
Simon Sapin <simon.sapin@octobus.net>
parents: 46821
diff changeset
550 hasher.update(a);
fad504cfc94b rust: Use a maintained crate for SHA-1 hashing
Simon Sapin <simon.sapin@octobus.net>
parents: 46821
diff changeset
551 hasher.update(b);
45531
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
552 }
47380
fad504cfc94b rust: Use a maintained crate for SHA-1 hashing
Simon Sapin <simon.sapin@octobus.net>
parents: 46821
diff changeset
553 hasher.update(data);
fad504cfc94b rust: Use a maintained crate for SHA-1 hashing
Simon Sapin <simon.sapin@octobus.net>
parents: 46821
diff changeset
554 *hasher.finalize().as_ref()
45531
b0d6309ff50c hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents: 45526
diff changeset
555 }
49094
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
556
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
557 #[cfg(test)]
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
558 mod tests {
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
559 use super::*;
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
560 use crate::index::{IndexEntryBuilder, INDEX_ENTRY_SIZE};
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
561 use itertools::Itertools;
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
562
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
563 #[test]
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
564 fn test_empty() {
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
565 let temp = tempfile::tempdir().unwrap();
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
566 let vfs = Vfs { base: temp.path() };
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
567 std::fs::write(temp.path().join("foo.i"), b"").unwrap();
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
568 let revlog = Revlog::open(&vfs, "foo.i", None, false).unwrap();
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
569 assert!(revlog.is_empty());
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
570 assert_eq!(revlog.len(), 0);
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
571 assert!(revlog.get_entry(0).is_err());
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
572 assert!(!revlog.has_rev(0));
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
573 }
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
574
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
575 #[test]
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
576 fn test_inline() {
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
577 let temp = tempfile::tempdir().unwrap();
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
578 let vfs = Vfs { base: temp.path() };
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
579 let node0 = Node::from_hex("2ed2a3912a0b24502043eae84ee4b279c18b90dd")
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
580 .unwrap();
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
581 let node1 = Node::from_hex("b004912a8510032a0350a74daa2803dadfb00e12")
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
582 .unwrap();
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
583 let node2 = Node::from_hex("dd6ad206e907be60927b5a3117b97dffb2590582")
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
584 .unwrap();
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
585 let entry0_bytes = IndexEntryBuilder::new()
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
586 .is_first(true)
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
587 .with_version(1)
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
588 .with_inline(true)
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
589 .with_offset(INDEX_ENTRY_SIZE)
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
590 .with_node(node0)
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
591 .build();
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
592 let entry1_bytes = IndexEntryBuilder::new()
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
593 .with_offset(INDEX_ENTRY_SIZE)
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
594 .with_node(node1)
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
595 .build();
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
596 let entry2_bytes = IndexEntryBuilder::new()
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
597 .with_offset(INDEX_ENTRY_SIZE)
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
598 .with_p1(0)
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
599 .with_p2(1)
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
600 .with_node(node2)
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
601 .build();
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
602 let contents = vec![entry0_bytes, entry1_bytes, entry2_bytes]
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
603 .into_iter()
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
604 .flatten()
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
605 .collect_vec();
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
606 std::fs::write(temp.path().join("foo.i"), contents).unwrap();
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
607 let revlog = Revlog::open(&vfs, "foo.i", None, false).unwrap();
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
608
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
609 let entry0 = revlog.get_entry(0).ok().unwrap();
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
610 assert_eq!(entry0.revision(), 0);
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
611 assert_eq!(*entry0.node(), node0);
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
612 assert!(!entry0.has_p1());
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
613 assert_eq!(entry0.p1(), None);
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
614 assert_eq!(entry0.p2(), None);
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
615 let p1_entry = entry0.p1_entry().unwrap();
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
616 assert!(p1_entry.is_none());
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
617 let p2_entry = entry0.p2_entry().unwrap();
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
618 assert!(p2_entry.is_none());
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
619
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
620 let entry1 = revlog.get_entry(1).ok().unwrap();
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
621 assert_eq!(entry1.revision(), 1);
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
622 assert_eq!(*entry1.node(), node1);
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
623 assert!(!entry1.has_p1());
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
624 assert_eq!(entry1.p1(), None);
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
625 assert_eq!(entry1.p2(), None);
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
626 let p1_entry = entry1.p1_entry().unwrap();
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
627 assert!(p1_entry.is_none());
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
628 let p2_entry = entry1.p2_entry().unwrap();
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
629 assert!(p2_entry.is_none());
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
630
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
631 let entry2 = revlog.get_entry(2).ok().unwrap();
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
632 assert_eq!(entry2.revision(), 2);
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
633 assert_eq!(*entry2.node(), node2);
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
634 assert!(entry2.has_p1());
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
635 assert_eq!(entry2.p1(), Some(0));
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
636 assert_eq!(entry2.p2(), Some(1));
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
637 let p1_entry = entry2.p1_entry().unwrap();
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
638 assert!(p1_entry.is_some());
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
639 assert_eq!(p1_entry.unwrap().revision(), 0);
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
640 let p2_entry = entry2.p2_entry().unwrap();
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
641 assert!(p2_entry.is_some());
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
642 assert_eq!(p2_entry.unwrap().revision(), 1);
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
643 }
a9ece9796a97 rust-revlog: add tests for p1/p2 getters, as promised in D12442
Martin von Zweigbergk <martinvonz@google.com>
parents: 49089
diff changeset
644 }