author | Raphaël Gomès <rgomes@octobus.net> |
Thu, 03 Aug 2023 15:50:14 +0200 | |
changeset 51234 | 62e39bef36ca |
parent 51233 | 9b06e7f32bc5 |
child 51236 | a7bba7df9189 |
permissions | -rw-r--r-- |
51233
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
1 |
use std::collections::HashSet; |
50988
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
2 |
use std::fmt::Debug; |
45604
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
3 |
use std::ops::Deref; |
51218
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
4 |
use std::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard}; |
45604
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
5 |
|
45537
b0d6309ff50c
hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45532
diff
changeset
|
6 |
use byteorder::{BigEndian, ByteOrder}; |
51210
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
7 |
use bytes_cast::{unaligned, BytesCast}; |
45537
b0d6309ff50c
hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45532
diff
changeset
|
8 |
|
51210
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
9 |
use super::REVIDX_KNOWN_FLAGS; |
46511
43d63979a75e
rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents:
46091
diff
changeset
|
10 |
use crate::errors::HgError; |
51230
e9d47e2f5dcf
rust-index: add missing special case for null rev
Raphaël Gomès <rgomes@octobus.net>
parents:
51226
diff
changeset
|
11 |
use crate::node::{NODE_BYTES_LENGTH, NULL_NODE, STORED_NODE_ID_BYTES}; |
46037
88e741bf2d93
rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents:
45605
diff
changeset
|
12 |
use crate::revlog::node::Node; |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
13 |
use crate::revlog::{Revision, NULL_REVISION}; |
51233
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
14 |
use crate::{ |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
15 |
BaseRevision, FastHashMap, Graph, GraphError, RevlogError, RevlogIndex, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
16 |
UncheckedRevision, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
17 |
}; |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
18 |
|
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
19 |
pub const INDEX_ENTRY_SIZE: usize = 64; |
51210
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
20 |
pub const COMPRESSION_MODE_INLINE: u8 = 2; |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
21 |
|
48496
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
22 |
pub struct IndexHeader { |
51212
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents:
51210
diff
changeset
|
23 |
pub(super) header_bytes: [u8; 4], |
48496
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
24 |
} |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
25 |
|
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
26 |
#[derive(Copy, Clone)] |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
27 |
pub struct IndexHeaderFlags { |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
28 |
flags: u16, |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
29 |
} |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
30 |
|
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
31 |
/// Corresponds to the high bits of `_format_flags` in python |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
32 |
impl IndexHeaderFlags { |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
33 |
/// Corresponds to FLAG_INLINE_DATA in python |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
34 |
pub fn is_inline(self) -> bool { |
50003
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents:
49999
diff
changeset
|
35 |
self.flags & 1 != 0 |
48496
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
36 |
} |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
37 |
/// Corresponds to FLAG_GENERALDELTA in python |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
38 |
pub fn uses_generaldelta(self) -> bool { |
50003
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents:
49999
diff
changeset
|
39 |
self.flags & 2 != 0 |
48496
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
40 |
} |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
41 |
} |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
42 |
|
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
43 |
/// Corresponds to the INDEX_HEADER structure, |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
44 |
/// which is parsed as a `header` variable in `_loadindex` in `revlog.py` |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
45 |
impl IndexHeader { |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
46 |
fn format_flags(&self) -> IndexHeaderFlags { |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
47 |
// No "unknown flags" check here, unlike in python. Maybe there should |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
48 |
// be. |
50003
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents:
49999
diff
changeset
|
49 |
IndexHeaderFlags { |
48496
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
50 |
flags: BigEndian::read_u16(&self.header_bytes[0..2]), |
50003
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents:
49999
diff
changeset
|
51 |
} |
48496
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
52 |
} |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
53 |
|
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
54 |
/// The only revlog version currently supported by rhg. |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
55 |
const REVLOGV1: u16 = 1; |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
56 |
|
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
57 |
/// Corresponds to `_format_version` in Python. |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
58 |
fn format_version(&self) -> u16 { |
50003
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents:
49999
diff
changeset
|
59 |
BigEndian::read_u16(&self.header_bytes[2..4]) |
48496
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
60 |
} |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
61 |
|
51212
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents:
51210
diff
changeset
|
62 |
pub fn parse(index_bytes: &[u8]) -> Result<Option<IndexHeader>, HgError> { |
50003
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents:
49999
diff
changeset
|
63 |
if index_bytes.is_empty() { |
51212
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents:
51210
diff
changeset
|
64 |
return Ok(None); |
48496
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
65 |
} |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
66 |
if index_bytes.len() < 4 { |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
67 |
return Err(HgError::corrupted( |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
68 |
"corrupted revlog: can't read the index format header", |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
69 |
)); |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
70 |
} |
51212
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents:
51210
diff
changeset
|
71 |
Ok(Some(IndexHeader { |
48496
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
72 |
header_bytes: { |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
73 |
let bytes: [u8; 4] = |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
74 |
index_bytes[0..4].try_into().expect("impossible"); |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
75 |
bytes |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
76 |
}, |
51212
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents:
51210
diff
changeset
|
77 |
})) |
48496
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
78 |
} |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
79 |
} |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
80 |
|
51209
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
81 |
/// Abstracts the access to the index bytes since they can be spread between |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
82 |
/// the immutable (bytes) part and the mutable (added) part if any appends |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
83 |
/// happened. This makes it transparent for the callers. |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
84 |
struct IndexData { |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
85 |
/// Immutable bytes, most likely taken from disk |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
86 |
bytes: Box<dyn Deref<Target = [u8]> + Send>, |
51216
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
87 |
/// Used when stripping index contents, keeps track of the start of the |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
88 |
/// first stripped revision, which is used to give a slice of the |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
89 |
/// `bytes` field. |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
90 |
truncation: Option<usize>, |
51209
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
91 |
/// Bytes that were added after reading the index |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
92 |
added: Vec<u8>, |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
93 |
} |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
94 |
|
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
95 |
impl IndexData { |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
96 |
pub fn new(bytes: Box<dyn Deref<Target = [u8]> + Send>) -> Self { |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
97 |
Self { |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
98 |
bytes, |
51216
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
99 |
truncation: None, |
51209
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
100 |
added: vec![], |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
101 |
} |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
102 |
} |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
103 |
|
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
104 |
pub fn len(&self) -> usize { |
51216
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
105 |
match self.truncation { |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
106 |
Some(truncation) => truncation + self.added.len(), |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
107 |
None => self.bytes.len() + self.added.len(), |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
108 |
} |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
109 |
} |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
110 |
|
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
111 |
fn remove( |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
112 |
&mut self, |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
113 |
rev: Revision, |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
114 |
offsets: Option<&[usize]>, |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
115 |
) -> Result<(), RevlogError> { |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
116 |
let rev = rev.0 as usize; |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
117 |
let truncation = if let Some(offsets) = offsets { |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
118 |
offsets[rev] |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
119 |
} else { |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
120 |
rev * INDEX_ENTRY_SIZE |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
121 |
}; |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
122 |
if truncation < self.bytes.len() { |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
123 |
self.truncation = Some(truncation); |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
124 |
self.added.clear(); |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
125 |
} else { |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
126 |
self.added.truncate(truncation - self.bytes.len()); |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
127 |
} |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
128 |
Ok(()) |
51209
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
129 |
} |
51226
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
130 |
|
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
131 |
fn is_new(&self) -> bool { |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
132 |
self.bytes.is_empty() |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
133 |
} |
51209
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
134 |
} |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
135 |
|
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
136 |
impl std::ops::Index<std::ops::Range<usize>> for IndexData { |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
137 |
type Output = [u8]; |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
138 |
|
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
139 |
fn index(&self, index: std::ops::Range<usize>) -> &Self::Output { |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
140 |
let start = index.start; |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
141 |
let end = index.end; |
51216
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
142 |
let immutable_len = match self.truncation { |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
143 |
Some(truncation) => truncation, |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
144 |
None => self.bytes.len(), |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
145 |
}; |
51209
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
146 |
if start < immutable_len { |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
147 |
if end > immutable_len { |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
148 |
panic!("index data cannot span existing and added ranges"); |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
149 |
} |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
150 |
&self.bytes[index] |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
151 |
} else { |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
152 |
&self.added[start - immutable_len..end - immutable_len] |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
153 |
} |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
154 |
} |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
155 |
} |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
156 |
|
51226
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
157 |
#[derive(Debug, PartialEq, Eq)] |
51210
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
158 |
pub struct RevisionDataParams { |
51213
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
159 |
pub flags: u16, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
160 |
pub data_offset: u64, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
161 |
pub data_compressed_length: i32, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
162 |
pub data_uncompressed_length: i32, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
163 |
pub data_delta_base: i32, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
164 |
pub link_rev: i32, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
165 |
pub parent_rev_1: i32, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
166 |
pub parent_rev_2: i32, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
167 |
pub node_id: [u8; NODE_BYTES_LENGTH], |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
168 |
pub _sidedata_offset: u64, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
169 |
pub _sidedata_compressed_length: i32, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
170 |
pub data_compression_mode: u8, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
171 |
pub _sidedata_compression_mode: u8, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
172 |
pub _rank: i32, |
51210
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
173 |
} |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
174 |
|
51226
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
175 |
impl Default for RevisionDataParams { |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
176 |
fn default() -> Self { |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
177 |
Self { |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
178 |
flags: 0, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
179 |
data_offset: 0, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
180 |
data_compressed_length: 0, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
181 |
data_uncompressed_length: 0, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
182 |
data_delta_base: -1, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
183 |
link_rev: -1, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
184 |
parent_rev_1: -1, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
185 |
parent_rev_2: -1, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
186 |
node_id: [0; NODE_BYTES_LENGTH], |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
187 |
_sidedata_offset: 0, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
188 |
_sidedata_compressed_length: 0, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
189 |
data_compression_mode: COMPRESSION_MODE_INLINE, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
190 |
_sidedata_compression_mode: COMPRESSION_MODE_INLINE, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
191 |
_rank: -1, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
192 |
} |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
193 |
} |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
194 |
} |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
195 |
|
51210
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
196 |
#[derive(BytesCast)] |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
197 |
#[repr(C)] |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
198 |
pub struct RevisionDataV1 { |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
199 |
data_offset_or_flags: unaligned::U64Be, |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
200 |
data_compressed_length: unaligned::I32Be, |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
201 |
data_uncompressed_length: unaligned::I32Be, |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
202 |
data_delta_base: unaligned::I32Be, |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
203 |
link_rev: unaligned::I32Be, |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
204 |
parent_rev_1: unaligned::I32Be, |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
205 |
parent_rev_2: unaligned::I32Be, |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
206 |
node_id: [u8; STORED_NODE_ID_BYTES], |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
207 |
} |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
208 |
|
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
209 |
fn _static_assert_size_of_revision_data_v1() { |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
210 |
let _ = std::mem::transmute::<RevisionDataV1, [u8; 64]>; |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
211 |
} |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
212 |
|
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
213 |
impl RevisionDataParams { |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
214 |
pub fn validate(&self) -> Result<(), RevlogError> { |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
215 |
if self.flags & !REVIDX_KNOWN_FLAGS != 0 { |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
216 |
return Err(RevlogError::corrupted(format!( |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
217 |
"unknown revlog index flags: {}", |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
218 |
self.flags |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
219 |
))); |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
220 |
} |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
221 |
if self.data_compression_mode != COMPRESSION_MODE_INLINE { |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
222 |
return Err(RevlogError::corrupted(format!( |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
223 |
"invalid data compression mode: {}", |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
224 |
self.data_compression_mode |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
225 |
))); |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
226 |
} |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
227 |
// FIXME isn't this only for v2 or changelog v2? |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
228 |
if self._sidedata_compression_mode != COMPRESSION_MODE_INLINE { |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
229 |
return Err(RevlogError::corrupted(format!( |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
230 |
"invalid sidedata compression mode: {}", |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
231 |
self._sidedata_compression_mode |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
232 |
))); |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
233 |
} |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
234 |
Ok(()) |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
235 |
} |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
236 |
|
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
237 |
pub fn into_v1(self) -> RevisionDataV1 { |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
238 |
let data_offset_or_flags = self.data_offset << 16 | self.flags as u64; |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
239 |
let mut node_id = [0; STORED_NODE_ID_BYTES]; |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
240 |
node_id[..NODE_BYTES_LENGTH].copy_from_slice(&self.node_id); |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
241 |
RevisionDataV1 { |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
242 |
data_offset_or_flags: data_offset_or_flags.into(), |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
243 |
data_compressed_length: self.data_compressed_length.into(), |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
244 |
data_uncompressed_length: self.data_uncompressed_length.into(), |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
245 |
data_delta_base: self.data_delta_base.into(), |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
246 |
link_rev: self.link_rev.into(), |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
247 |
parent_rev_1: self.parent_rev_1.into(), |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
248 |
parent_rev_2: self.parent_rev_2.into(), |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
249 |
node_id, |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
250 |
} |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
251 |
} |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
252 |
} |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
253 |
|
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
254 |
/// A Revlog index |
45604
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
255 |
pub struct Index { |
51209
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
256 |
bytes: IndexData, |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
257 |
/// Offsets of starts of index blocks. |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
258 |
/// Only needed when the index is interleaved with data. |
51218
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
259 |
offsets: RwLock<Option<Vec<usize>>>, |
48497
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48496
diff
changeset
|
260 |
uses_generaldelta: bool, |
51218
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
261 |
is_inline: bool, |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
262 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
263 |
|
50988
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
264 |
impl Debug for Index { |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
265 |
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
266 |
f.debug_struct("Index") |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
267 |
.field("offsets", &self.offsets) |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
268 |
.field("uses_generaldelta", &self.uses_generaldelta) |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
269 |
.finish() |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
270 |
} |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
271 |
} |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
272 |
|
50989
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50988
diff
changeset
|
273 |
impl Graph for Index { |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50988
diff
changeset
|
274 |
fn parents(&self, rev: Revision) -> Result<[Revision; 2], GraphError> { |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50988
diff
changeset
|
275 |
let err = || GraphError::ParentOutOfRange(rev); |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50988
diff
changeset
|
276 |
match self.get_entry(rev) { |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50988
diff
changeset
|
277 |
Some(entry) => { |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50988
diff
changeset
|
278 |
// The C implementation checks that the parents are valid |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50988
diff
changeset
|
279 |
// before returning |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50988
diff
changeset
|
280 |
Ok([ |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50988
diff
changeset
|
281 |
self.check_revision(entry.p1()).ok_or_else(err)?, |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50988
diff
changeset
|
282 |
self.check_revision(entry.p2()).ok_or_else(err)?, |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50988
diff
changeset
|
283 |
]) |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50988
diff
changeset
|
284 |
} |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50988
diff
changeset
|
285 |
None => Ok([NULL_REVISION, NULL_REVISION]), |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50988
diff
changeset
|
286 |
} |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50988
diff
changeset
|
287 |
} |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50988
diff
changeset
|
288 |
} |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50988
diff
changeset
|
289 |
|
51233
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
290 |
/// A cache suitable for find_snapshots |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
291 |
/// |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
292 |
/// Logically equivalent to a mapping whose keys are [`BaseRevision`] and |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
293 |
/// values sets of [`BaseRevision`] |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
294 |
/// |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
295 |
/// TODO the dubious part is insisting that errors must be RevlogError |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
296 |
/// we would probably need to sprinkle some magic here, such as an associated |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
297 |
/// type that would be Into<RevlogError> but even that would not be |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
298 |
/// satisfactory, as errors potentially have nothing to do with the revlog. |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
299 |
pub trait SnapshotsCache { |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
300 |
fn insert_for( |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
301 |
&mut self, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
302 |
rev: BaseRevision, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
303 |
value: BaseRevision, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
304 |
) -> Result<(), RevlogError>; |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
305 |
} |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
306 |
|
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
307 |
impl SnapshotsCache for FastHashMap<BaseRevision, HashSet<BaseRevision>> { |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
308 |
fn insert_for( |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
309 |
&mut self, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
310 |
rev: BaseRevision, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
311 |
value: BaseRevision, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
312 |
) -> Result<(), RevlogError> { |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
313 |
let all_values = self.entry(rev).or_insert_with(HashSet::new); |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
314 |
all_values.insert(value); |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
315 |
Ok(()) |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
316 |
} |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
317 |
} |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
318 |
|
45604
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
319 |
impl Index { |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
320 |
/// Create an index from bytes. |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
321 |
/// Calculate the start of each entry when is_inline is true. |
45605
1cef583541c0
hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents:
45604
diff
changeset
|
322 |
pub fn new( |
1cef583541c0
hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents:
45604
diff
changeset
|
323 |
bytes: Box<dyn Deref<Target = [u8]> + Send>, |
51212
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents:
51210
diff
changeset
|
324 |
default_header: IndexHeader, |
47991
001d747c2baf
rust: Return HgError instead of RevlogError in revlog constructors
Simon Sapin <simon.sapin@octobus.net>
parents:
46887
diff
changeset
|
325 |
) -> Result<Self, HgError> { |
51212
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents:
51210
diff
changeset
|
326 |
let header = |
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents:
51210
diff
changeset
|
327 |
IndexHeader::parse(bytes.as_ref())?.unwrap_or(default_header); |
48496
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
328 |
|
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
329 |
if header.format_version() != IndexHeader::REVLOGV1 { |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
330 |
// A proper new version should have had a repo/store |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
331 |
// requirement. |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
332 |
return Err(HgError::corrupted("unsupported revlog version")); |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
333 |
} |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
334 |
|
48497
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48496
diff
changeset
|
335 |
// This is only correct because we know version is REVLOGV1. |
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48496
diff
changeset
|
336 |
// In v2 we always use generaldelta, while in v0 we never use |
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48496
diff
changeset
|
337 |
// generaldelta. Similar for [is_inline] (it's only used in v1). |
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48496
diff
changeset
|
338 |
let uses_generaldelta = header.format_flags().uses_generaldelta(); |
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48496
diff
changeset
|
339 |
|
48496
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
340 |
if header.format_flags().is_inline() { |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
341 |
let mut offset: usize = 0; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
342 |
let mut offsets = Vec::new(); |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
343 |
|
45593
11f3c3f408fd
hg-core: minor code style change (D8958#inline-14993 followup)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45542
diff
changeset
|
344 |
while offset + INDEX_ENTRY_SIZE <= bytes.len() { |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
345 |
offsets.push(offset); |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
346 |
let end = offset + INDEX_ENTRY_SIZE; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
347 |
let entry = IndexEntry { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
348 |
bytes: &bytes[offset..end], |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
349 |
offset_override: None, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
350 |
}; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
351 |
|
48572
0a4ac916673e
rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents:
48497
diff
changeset
|
352 |
offset += INDEX_ENTRY_SIZE + entry.compressed_len() as usize; |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
353 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
354 |
|
45605
1cef583541c0
hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents:
45604
diff
changeset
|
355 |
if offset == bytes.len() { |
1cef583541c0
hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents:
45604
diff
changeset
|
356 |
Ok(Self { |
51209
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
357 |
bytes: IndexData::new(bytes), |
51218
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
358 |
offsets: RwLock::new(Some(offsets)), |
48497
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48496
diff
changeset
|
359 |
uses_generaldelta, |
51218
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
360 |
is_inline: true, |
45605
1cef583541c0
hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents:
45604
diff
changeset
|
361 |
}) |
1cef583541c0
hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents:
45604
diff
changeset
|
362 |
} else { |
50003
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents:
49999
diff
changeset
|
363 |
Err(HgError::corrupted("unexpected inline revlog length")) |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
364 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
365 |
} else { |
45605
1cef583541c0
hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents:
45604
diff
changeset
|
366 |
Ok(Self { |
51209
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50990
diff
changeset
|
367 |
bytes: IndexData::new(bytes), |
51218
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
368 |
offsets: RwLock::new(None), |
48497
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48496
diff
changeset
|
369 |
uses_generaldelta, |
51218
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
370 |
is_inline: false, |
45605
1cef583541c0
hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents:
45604
diff
changeset
|
371 |
}) |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
372 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
373 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
374 |
|
48497
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48496
diff
changeset
|
375 |
pub fn uses_generaldelta(&self) -> bool { |
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48496
diff
changeset
|
376 |
self.uses_generaldelta |
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48496
diff
changeset
|
377 |
} |
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48496
diff
changeset
|
378 |
|
45604
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
379 |
/// Value of the inline flag. |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
380 |
pub fn is_inline(&self) -> bool { |
51218
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
381 |
self.is_inline |
45604
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
382 |
} |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
383 |
|
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
384 |
/// Return a slice of bytes if `revlog` is inline. Panic if not. |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
385 |
pub fn data(&self, start: usize, end: usize) -> &[u8] { |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
386 |
if !self.is_inline() { |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
387 |
panic!("tried to access data in the index of a revlog that is not inline"); |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
388 |
} |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
389 |
&self.bytes[start..end] |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
390 |
} |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
391 |
|
45542
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45537
diff
changeset
|
392 |
/// Return number of entries of the revlog index. |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45537
diff
changeset
|
393 |
pub fn len(&self) -> usize { |
51218
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
394 |
if let Some(offsets) = &*self.get_offsets() { |
45542
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45537
diff
changeset
|
395 |
offsets.len() |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45537
diff
changeset
|
396 |
} else { |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45537
diff
changeset
|
397 |
self.bytes.len() / INDEX_ENTRY_SIZE |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45537
diff
changeset
|
398 |
} |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45537
diff
changeset
|
399 |
} |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45537
diff
changeset
|
400 |
|
51218
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
401 |
pub fn get_offsets(&self) -> RwLockReadGuard<Option<Vec<usize>>> { |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
402 |
if self.is_inline() { |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
403 |
{ |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
404 |
// Wrap in a block to drop the read guard |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
405 |
// TODO perf? |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
406 |
let mut offsets = self.offsets.write().unwrap(); |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
407 |
if offsets.is_none() { |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
408 |
offsets.replace(inline_scan(&self.bytes.bytes).1); |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
409 |
} |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
410 |
} |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
411 |
} |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
412 |
self.offsets.read().unwrap() |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
413 |
} |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
414 |
|
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
415 |
pub fn get_offsets_mut(&mut self) -> RwLockWriteGuard<Option<Vec<usize>>> { |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
416 |
let mut offsets = self.offsets.write().unwrap(); |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
417 |
if self.is_inline() && offsets.is_none() { |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
418 |
offsets.replace(inline_scan(&self.bytes.bytes).1); |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
419 |
} |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
420 |
offsets |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
421 |
} |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
422 |
|
45542
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45537
diff
changeset
|
423 |
/// Returns `true` if the `Index` has zero `entries`. |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45537
diff
changeset
|
424 |
pub fn is_empty(&self) -> bool { |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45537
diff
changeset
|
425 |
self.len() == 0 |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45537
diff
changeset
|
426 |
} |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45537
diff
changeset
|
427 |
|
51224
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
428 |
/// Return the index entry corresponding to the given revision or `None` |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
429 |
/// for [`NULL_REVISION`] |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
430 |
/// |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
431 |
/// The specified revision being of the checked type, it always exists |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
432 |
/// if it was validated by this index. |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
433 |
pub fn get_entry(&self, rev: Revision) -> Option<IndexEntry> { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
434 |
if rev == NULL_REVISION { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
435 |
return None; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
436 |
} |
51218
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
437 |
Some(if let Some(offsets) = &*self.get_offsets() { |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
438 |
self.get_entry_inline(rev, offsets.as_ref()) |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
439 |
} else { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
440 |
self.get_entry_separated(rev) |
50988
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
441 |
}) |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
442 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
443 |
|
51224
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
444 |
/// Return the binary content of the index entry for the given revision |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
445 |
/// |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
446 |
/// See [get_entry()](`Self::get_entry()`) for cases when `None` is |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
447 |
/// returned. |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
448 |
pub fn entry_binary(&self, rev: Revision) -> Option<&[u8]> { |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
449 |
self.get_entry(rev).map(|e| { |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
450 |
let bytes = e.as_bytes(); |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
451 |
if rev.0 == 0 { |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
452 |
&bytes[4..] |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
453 |
} else { |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
454 |
bytes |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
455 |
} |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
456 |
}) |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
457 |
} |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
458 |
|
51226
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
459 |
pub fn entry_as_params( |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
460 |
&self, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
461 |
rev: UncheckedRevision, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
462 |
) -> Option<RevisionDataParams> { |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
463 |
let rev = self.check_revision(rev)?; |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
464 |
self.get_entry(rev).map(|e| RevisionDataParams { |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
465 |
flags: e.flags(), |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
466 |
data_offset: if rev.0 == 0 && !self.bytes.is_new() { |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
467 |
e.flags() as u64 |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
468 |
} else { |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
469 |
e.raw_offset() |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
470 |
}, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
471 |
data_compressed_length: e.compressed_len().try_into().unwrap(), |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
472 |
data_uncompressed_length: e.uncompressed_len(), |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
473 |
data_delta_base: e.base_revision_or_base_of_delta_chain().0, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
474 |
link_rev: e.link_revision().0, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
475 |
parent_rev_1: e.p1().0, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
476 |
parent_rev_2: e.p2().0, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
477 |
node_id: e.hash().as_bytes().try_into().unwrap(), |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
478 |
..Default::default() |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
479 |
}) |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
480 |
} |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
481 |
|
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
482 |
fn get_entry_inline( |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
483 |
&self, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
484 |
rev: Revision, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
485 |
offsets: &[usize], |
50988
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
486 |
) -> IndexEntry { |
50990
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50989
diff
changeset
|
487 |
let start = offsets[rev.0 as usize]; |
50988
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
488 |
let end = start + INDEX_ENTRY_SIZE; |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
489 |
let bytes = &self.bytes[start..end]; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
490 |
|
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
491 |
// See IndexEntry for an explanation of this override. |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
492 |
let offset_override = Some(end); |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
493 |
|
50988
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
494 |
IndexEntry { |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
495 |
bytes, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
496 |
offset_override, |
50988
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
497 |
} |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
498 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
499 |
|
50988
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
500 |
fn get_entry_separated(&self, rev: Revision) -> IndexEntry { |
50990
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50989
diff
changeset
|
501 |
let start = rev.0 as usize * INDEX_ENTRY_SIZE; |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
502 |
let end = start + INDEX_ENTRY_SIZE; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
503 |
let bytes = &self.bytes[start..end]; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
504 |
|
45594
f38adf8b0711
hg-core: Explain offset override of first revision
Antoine cezar<acezar@chwitlabs.fr>
parents:
45593
diff
changeset
|
505 |
// Override the offset of the first revision as its bytes are used |
f38adf8b0711
hg-core: Explain offset override of first revision
Antoine cezar<acezar@chwitlabs.fr>
parents:
45593
diff
changeset
|
506 |
// for the index's metadata (saving space because it is always 0) |
50990
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50989
diff
changeset
|
507 |
let offset_override = if rev == Revision(0) { Some(0) } else { None }; |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
508 |
|
50988
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
509 |
IndexEntry { |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
510 |
bytes, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
511 |
offset_override, |
50988
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
512 |
} |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
513 |
} |
51210
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
514 |
|
51234
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
515 |
/// Obtain the delta chain for a revision. |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
516 |
/// |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
517 |
/// `stop_rev` specifies a revision to stop at. If not specified, we |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
518 |
/// stop at the base of the chain. |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
519 |
/// |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
520 |
/// Returns a 2-tuple of (chain, stopped) where `chain` is a vec of |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
521 |
/// revs in ascending order and `stopped` is a bool indicating whether |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
522 |
/// `stoprev` was hit. |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
523 |
pub fn delta_chain( |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
524 |
&self, |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
525 |
rev: Revision, |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
526 |
stop_rev: Option<Revision>, |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
527 |
) -> Result<(Vec<Revision>, bool), HgError> { |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
528 |
let mut current_rev = rev; |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
529 |
let mut entry = self.get_entry(rev).unwrap(); |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
530 |
let mut chain = vec![]; |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
531 |
while current_rev.0 != entry.base_revision_or_base_of_delta_chain().0 |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
532 |
&& stop_rev.map(|r| r != current_rev).unwrap_or(true) |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
533 |
{ |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
534 |
chain.push(current_rev); |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
535 |
let new_rev = if self.uses_generaldelta() { |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
536 |
entry.base_revision_or_base_of_delta_chain() |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
537 |
} else { |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
538 |
UncheckedRevision(current_rev.0 - 1) |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
539 |
}; |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
540 |
if new_rev.0 == NULL_REVISION.0 { |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
541 |
break; |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
542 |
} |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
543 |
current_rev = self.check_revision(new_rev).ok_or_else(|| { |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
544 |
HgError::corrupted(format!("Revision {new_rev} out of range")) |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
545 |
})?; |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
546 |
entry = self.get_entry(current_rev).unwrap() |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
547 |
} |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
548 |
|
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
549 |
let stopped = if stop_rev.map(|r| current_rev == r).unwrap_or(false) { |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
550 |
true |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
551 |
} else { |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
552 |
chain.push(current_rev); |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
553 |
false |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
554 |
}; |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
555 |
chain.reverse(); |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
556 |
Ok((chain, stopped)) |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
557 |
} |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51233
diff
changeset
|
558 |
|
51233
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
559 |
pub fn find_snapshots( |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
560 |
&self, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
561 |
start_rev: UncheckedRevision, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
562 |
end_rev: UncheckedRevision, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
563 |
cache: &mut impl SnapshotsCache, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
564 |
) -> Result<(), RevlogError> { |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
565 |
let mut start_rev = start_rev.0; |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
566 |
let mut end_rev = end_rev.0; |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
567 |
end_rev += 1; |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
568 |
let len = self.len().try_into().unwrap(); |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
569 |
if end_rev > len { |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
570 |
end_rev = len; |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
571 |
} |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
572 |
if start_rev < 0 { |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
573 |
start_rev = 0; |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
574 |
} |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
575 |
for rev in start_rev..end_rev { |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
576 |
if !self.is_snapshot_unchecked(Revision(rev))? { |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
577 |
continue; |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
578 |
} |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
579 |
let mut base = self |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
580 |
.get_entry(Revision(rev)) |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
581 |
.unwrap() |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
582 |
.base_revision_or_base_of_delta_chain(); |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
583 |
if base.0 == rev { |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
584 |
base = NULL_REVISION.into(); |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
585 |
} |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
586 |
cache.insert_for(base.0, rev)?; |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
587 |
} |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
588 |
Ok(()) |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
589 |
} |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51232
diff
changeset
|
590 |
|
51210
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
591 |
/// TODO move this to the trait probably, along with other things |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
592 |
pub fn append( |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
593 |
&mut self, |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
594 |
revision_data: RevisionDataParams, |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
595 |
) -> Result<(), RevlogError> { |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
596 |
revision_data.validate()?; |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
597 |
let new_offset = self.bytes.len(); |
51218
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
598 |
if let Some(offsets) = &mut *self.get_offsets_mut() { |
51210
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
599 |
offsets.push(new_offset) |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
600 |
} |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
601 |
self.bytes.added.extend(revision_data.into_v1().as_bytes()); |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
602 |
Ok(()) |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
603 |
} |
51216
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
604 |
|
51219
51cc12158f97
rust-index: add `pack_header` support
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
605 |
pub fn pack_header(&self, header: i32) -> [u8; 4] { |
51cc12158f97
rust-index: add `pack_header` support
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
606 |
header.to_be_bytes() |
51cc12158f97
rust-index: add `pack_header` support
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
607 |
} |
51cc12158f97
rust-index: add `pack_header` support
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
608 |
|
51216
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
609 |
pub fn remove(&mut self, rev: Revision) -> Result<(), RevlogError> { |
51218
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
610 |
let offsets = self.get_offsets().clone(); |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
611 |
self.bytes.remove(rev, offsets.as_deref())?; |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
612 |
if let Some(offsets) = &mut *self.get_offsets_mut() { |
51216
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
613 |
offsets.truncate(rev.0 as usize) |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
614 |
} |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
615 |
Ok(()) |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
616 |
} |
51218
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
617 |
|
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
618 |
pub fn clear_caches(&mut self) { |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
619 |
// We need to get the 'inline' value from Python at init and use this |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
620 |
// instead of offsets to determine whether we're inline since we might |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
621 |
// clear caches. This implies re-populating the offsets on-demand. |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
622 |
self.offsets = RwLock::new(None); |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
623 |
} |
51232
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
624 |
|
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
625 |
/// Unchecked version of `is_snapshot`. |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
626 |
/// Assumes the caller checked that `rev` is within a valid revision range. |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
627 |
pub fn is_snapshot_unchecked( |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
628 |
&self, |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
629 |
mut rev: Revision, |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
630 |
) -> Result<bool, RevlogError> { |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
631 |
while rev.0 >= 0 { |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
632 |
let entry = self.get_entry(rev).unwrap(); |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
633 |
let mut base = entry.base_revision_or_base_of_delta_chain().0; |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
634 |
if base == rev.0 { |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
635 |
base = NULL_REVISION.0; |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
636 |
} |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
637 |
if base == NULL_REVISION.0 { |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
638 |
return Ok(true); |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
639 |
} |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
640 |
let [mut p1, mut p2] = self |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
641 |
.parents(rev) |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
642 |
.map_err(|_| RevlogError::InvalidRevision)?; |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
643 |
while let Some(p1_entry) = self.get_entry(p1) { |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
644 |
if p1_entry.compressed_len() != 0 || p1.0 == 0 { |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
645 |
break; |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
646 |
} |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
647 |
let parent_base = |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
648 |
p1_entry.base_revision_or_base_of_delta_chain(); |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
649 |
if parent_base.0 == p1.0 { |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
650 |
break; |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
651 |
} |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
652 |
p1 = self |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
653 |
.check_revision(parent_base) |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
654 |
.ok_or(RevlogError::InvalidRevision)?; |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
655 |
} |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
656 |
while let Some(p2_entry) = self.get_entry(p2) { |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
657 |
if p2_entry.compressed_len() != 0 || p2.0 == 0 { |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
658 |
break; |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
659 |
} |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
660 |
let parent_base = |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
661 |
p2_entry.base_revision_or_base_of_delta_chain(); |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
662 |
if parent_base.0 == p2.0 { |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
663 |
break; |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
664 |
} |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
665 |
p2 = self |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
666 |
.check_revision(parent_base) |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
667 |
.ok_or(RevlogError::InvalidRevision)?; |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
668 |
} |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
669 |
if base == p1.0 || base == p2.0 { |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
670 |
return Ok(false); |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
671 |
} |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
672 |
rev = self |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
673 |
.check_revision(base.into()) |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
674 |
.ok_or(RevlogError::InvalidRevision)?; |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
675 |
} |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
676 |
Ok(rev == NULL_REVISION) |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
677 |
} |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
678 |
|
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
679 |
/// Return whether the given revision is a snapshot. Returns an error if |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
680 |
/// `rev` is not within a valid revision range. |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
681 |
pub fn is_snapshot( |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
682 |
&self, |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
683 |
rev: UncheckedRevision, |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
684 |
) -> Result<bool, RevlogError> { |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
685 |
let rev = self |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
686 |
.check_revision(rev) |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
687 |
.ok_or_else(|| RevlogError::corrupted("test"))?; |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
688 |
self.is_snapshot_unchecked(rev) |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51230
diff
changeset
|
689 |
} |
51218
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
690 |
} |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
691 |
fn inline_scan(bytes: &[u8]) -> (usize, Vec<usize>) { |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
692 |
let mut offset: usize = 0; |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
693 |
let mut offsets = Vec::new(); |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
694 |
|
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
695 |
while offset + INDEX_ENTRY_SIZE <= bytes.len() { |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
696 |
offsets.push(offset); |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
697 |
let end = offset + INDEX_ENTRY_SIZE; |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
698 |
let entry = IndexEntry { |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
699 |
bytes: &bytes[offset..end], |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
700 |
offset_override: None, |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
701 |
}; |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
702 |
|
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
703 |
offset += INDEX_ENTRY_SIZE + entry.compressed_len() as usize; |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
704 |
} |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
705 |
(offset, offsets) |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
706 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
707 |
|
46091
9eb07ab3f2d4
rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents:
46037
diff
changeset
|
708 |
impl super::RevlogIndex for Index { |
9eb07ab3f2d4
rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents:
46037
diff
changeset
|
709 |
fn len(&self) -> usize { |
9eb07ab3f2d4
rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents:
46037
diff
changeset
|
710 |
self.len() |
9eb07ab3f2d4
rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents:
46037
diff
changeset
|
711 |
} |
9eb07ab3f2d4
rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents:
46037
diff
changeset
|
712 |
|
9eb07ab3f2d4
rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents:
46037
diff
changeset
|
713 |
fn node(&self, rev: Revision) -> Option<&Node> { |
51230
e9d47e2f5dcf
rust-index: add missing special case for null rev
Raphaël Gomès <rgomes@octobus.net>
parents:
51226
diff
changeset
|
714 |
if rev == NULL_REVISION { |
e9d47e2f5dcf
rust-index: add missing special case for null rev
Raphaël Gomès <rgomes@octobus.net>
parents:
51226
diff
changeset
|
715 |
return Some(&NULL_NODE); |
e9d47e2f5dcf
rust-index: add missing special case for null rev
Raphaël Gomès <rgomes@octobus.net>
parents:
51226
diff
changeset
|
716 |
} |
46091
9eb07ab3f2d4
rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents:
46037
diff
changeset
|
717 |
self.get_entry(rev).map(|entry| entry.hash()) |
9eb07ab3f2d4
rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents:
46037
diff
changeset
|
718 |
} |
9eb07ab3f2d4
rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents:
46037
diff
changeset
|
719 |
} |
9eb07ab3f2d4
rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents:
46037
diff
changeset
|
720 |
|
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
721 |
#[derive(Debug)] |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
722 |
pub struct IndexEntry<'a> { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
723 |
bytes: &'a [u8], |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
724 |
/// Allows to override the offset value of the entry. |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
725 |
/// |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
726 |
/// For interleaved index and data, the offset stored in the index |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
727 |
/// corresponds to the separated data offset. |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
728 |
/// It has to be overridden with the actual offset in the interleaved |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
729 |
/// index which is just after the index block. |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
730 |
/// |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
731 |
/// For separated index and data, the offset stored in the first index |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
732 |
/// entry is mixed with the index headers. |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
733 |
/// It has to be overridden with 0. |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
734 |
offset_override: Option<usize>, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
735 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
736 |
|
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
737 |
impl<'a> IndexEntry<'a> { |
45596
da30e4b553c3
hg-core: minor docstring update (D8958#inline-14991 followup)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45595
diff
changeset
|
738 |
/// Return the offset of the data. |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
739 |
pub fn offset(&self) -> usize { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
740 |
if let Some(offset_override) = self.offset_override { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
741 |
offset_override |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
742 |
} else { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
743 |
let mut bytes = [0; 8]; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
744 |
bytes[2..8].copy_from_slice(&self.bytes[0..=5]); |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
745 |
BigEndian::read_u64(&bytes[..]) as usize |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
746 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
747 |
} |
51226
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
748 |
pub fn raw_offset(&self) -> u64 { |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
749 |
BigEndian::read_u64(&self.bytes[0..8]) |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51224
diff
changeset
|
750 |
} |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
751 |
|
48575
e91aa800ae5b
rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents:
48572
diff
changeset
|
752 |
pub fn flags(&self) -> u16 { |
e91aa800ae5b
rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents:
48572
diff
changeset
|
753 |
BigEndian::read_u16(&self.bytes[6..=7]) |
e91aa800ae5b
rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents:
48572
diff
changeset
|
754 |
} |
e91aa800ae5b
rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents:
48572
diff
changeset
|
755 |
|
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
756 |
/// Return the compressed length of the data. |
48572
0a4ac916673e
rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents:
48497
diff
changeset
|
757 |
pub fn compressed_len(&self) -> u32 { |
0a4ac916673e
rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents:
48497
diff
changeset
|
758 |
BigEndian::read_u32(&self.bytes[8..=11]) |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
759 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
760 |
|
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
761 |
/// Return the uncompressed length of the data. |
48572
0a4ac916673e
rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents:
48497
diff
changeset
|
762 |
pub fn uncompressed_len(&self) -> i32 { |
0a4ac916673e
rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents:
48497
diff
changeset
|
763 |
BigEndian::read_i32(&self.bytes[12..=15]) |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
764 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
765 |
|
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
766 |
/// Return the revision upon which the data has been derived. |
50988
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
767 |
pub fn base_revision_or_base_of_delta_chain(&self) -> UncheckedRevision { |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
768 |
// TODO Maybe return an Option when base_revision == rev? |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
769 |
// Requires to add rev to IndexEntry |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
770 |
|
50988
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
771 |
BigEndian::read_i32(&self.bytes[16..]).into() |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
772 |
} |
45537
b0d6309ff50c
hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45532
diff
changeset
|
773 |
|
50988
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
774 |
pub fn link_revision(&self) -> UncheckedRevision { |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
775 |
BigEndian::read_i32(&self.bytes[20..]).into() |
49148
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
776 |
} |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
777 |
|
50988
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
778 |
pub fn p1(&self) -> UncheckedRevision { |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
779 |
BigEndian::read_i32(&self.bytes[24..]).into() |
45537
b0d6309ff50c
hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45532
diff
changeset
|
780 |
} |
b0d6309ff50c
hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45532
diff
changeset
|
781 |
|
50988
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
782 |
pub fn p2(&self) -> UncheckedRevision { |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
783 |
BigEndian::read_i32(&self.bytes[28..]).into() |
45537
b0d6309ff50c
hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45532
diff
changeset
|
784 |
} |
b0d6309ff50c
hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45532
diff
changeset
|
785 |
|
b0d6309ff50c
hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45532
diff
changeset
|
786 |
/// Return the hash of revision's full text. |
b0d6309ff50c
hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45532
diff
changeset
|
787 |
/// |
b0d6309ff50c
hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45532
diff
changeset
|
788 |
/// Currently, SHA-1 is used and only the first 20 bytes of this field |
b0d6309ff50c
hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45532
diff
changeset
|
789 |
/// are used. |
46091
9eb07ab3f2d4
rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents:
46037
diff
changeset
|
790 |
pub fn hash(&self) -> &'a Node { |
46037
88e741bf2d93
rust: use NodePrefix::from_hex instead of hex::decode directly
Simon Sapin <simon-commits@exyr.org>
parents:
45605
diff
changeset
|
791 |
(&self.bytes[32..52]).try_into().unwrap() |
45537
b0d6309ff50c
hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45532
diff
changeset
|
792 |
} |
51224
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
793 |
|
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
794 |
pub fn as_bytes(&self) -> &'a [u8] { |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
795 |
self.bytes |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51219
diff
changeset
|
796 |
} |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
797 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
798 |
|
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
799 |
#[cfg(test)] |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
800 |
mod tests { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
801 |
use super::*; |
49148
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
802 |
use crate::node::NULL_NODE; |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
803 |
|
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
804 |
#[cfg(test)] |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
805 |
#[derive(Debug, Copy, Clone)] |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
806 |
pub struct IndexEntryBuilder { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
807 |
is_first: bool, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
808 |
is_inline: bool, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
809 |
is_general_delta: bool, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
810 |
version: u16, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
811 |
offset: usize, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
812 |
compressed_len: usize, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
813 |
uncompressed_len: usize, |
48497
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48496
diff
changeset
|
814 |
base_revision_or_base_of_delta_chain: Revision, |
49148
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
815 |
link_revision: Revision, |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
816 |
p1: Revision, |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
817 |
p2: Revision, |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
818 |
node: Node, |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
819 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
820 |
|
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
821 |
#[cfg(test)] |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
822 |
impl IndexEntryBuilder { |
49999
0780371d6b1e
rust-clippy: tell `clippy` we don't need to declare a default here
Raphaël Gomès <rgomes@octobus.net>
parents:
49749
diff
changeset
|
823 |
#[allow(clippy::new_without_default)] |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
824 |
pub fn new() -> Self { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
825 |
Self { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
826 |
is_first: false, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
827 |
is_inline: false, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
828 |
is_general_delta: true, |
49147
d200ecb76c72
rust-revlog: change default version from 2 to 1 in test builder
Martin von Zweigbergk <martinvonz@google.com>
parents:
48575
diff
changeset
|
829 |
version: 1, |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
830 |
offset: 0, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
831 |
compressed_len: 0, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
832 |
uncompressed_len: 0, |
50990
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50989
diff
changeset
|
833 |
base_revision_or_base_of_delta_chain: Revision(0), |
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50989
diff
changeset
|
834 |
link_revision: Revision(0), |
49148
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
835 |
p1: NULL_REVISION, |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
836 |
p2: NULL_REVISION, |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
837 |
node: NULL_NODE, |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
838 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
839 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
840 |
|
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
841 |
pub fn is_first(&mut self, value: bool) -> &mut Self { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
842 |
self.is_first = value; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
843 |
self |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
844 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
845 |
|
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
846 |
pub fn with_inline(&mut self, value: bool) -> &mut Self { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
847 |
self.is_inline = value; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
848 |
self |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
849 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
850 |
|
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
851 |
pub fn with_general_delta(&mut self, value: bool) -> &mut Self { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
852 |
self.is_general_delta = value; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
853 |
self |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
854 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
855 |
|
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
856 |
pub fn with_version(&mut self, value: u16) -> &mut Self { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
857 |
self.version = value; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
858 |
self |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
859 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
860 |
|
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
861 |
pub fn with_offset(&mut self, value: usize) -> &mut Self { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
862 |
self.offset = value; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
863 |
self |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
864 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
865 |
|
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
866 |
pub fn with_compressed_len(&mut self, value: usize) -> &mut Self { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
867 |
self.compressed_len = value; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
868 |
self |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
869 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
870 |
|
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
871 |
pub fn with_uncompressed_len(&mut self, value: usize) -> &mut Self { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
872 |
self.uncompressed_len = value; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
873 |
self |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
874 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
875 |
|
48497
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48496
diff
changeset
|
876 |
pub fn with_base_revision_or_base_of_delta_chain( |
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48496
diff
changeset
|
877 |
&mut self, |
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48496
diff
changeset
|
878 |
value: Revision, |
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48496
diff
changeset
|
879 |
) -> &mut Self { |
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48496
diff
changeset
|
880 |
self.base_revision_or_base_of_delta_chain = value; |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
881 |
self |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
882 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
883 |
|
49148
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
884 |
pub fn with_link_revision(&mut self, value: Revision) -> &mut Self { |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
885 |
self.link_revision = value; |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
886 |
self |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
887 |
} |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
888 |
|
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
889 |
pub fn with_p1(&mut self, value: Revision) -> &mut Self { |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
890 |
self.p1 = value; |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
891 |
self |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
892 |
} |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
893 |
|
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
894 |
pub fn with_p2(&mut self, value: Revision) -> &mut Self { |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
895 |
self.p2 = value; |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
896 |
self |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
897 |
} |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
898 |
|
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
899 |
pub fn with_node(&mut self, value: Node) -> &mut Self { |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
900 |
self.node = value; |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
901 |
self |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
902 |
} |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
903 |
|
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
904 |
pub fn build(&self) -> Vec<u8> { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
905 |
let mut bytes = Vec::with_capacity(INDEX_ENTRY_SIZE); |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
906 |
if self.is_first { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
907 |
bytes.extend(&match (self.is_general_delta, self.is_inline) { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
908 |
(false, false) => [0u8, 0], |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
909 |
(false, true) => [0u8, 1], |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
910 |
(true, false) => [0u8, 2], |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
911 |
(true, true) => [0u8, 3], |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
912 |
}); |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
913 |
bytes.extend(&self.version.to_be_bytes()); |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
914 |
// Remaining offset bytes. |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
915 |
bytes.extend(&[0u8; 2]); |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
916 |
} else { |
46887
6d5a26e94d9e
unit-tests: Fix `cargo test` on 32-bit platforms
Simon Sapin <simon.sapin@octobus.net>
parents:
46511
diff
changeset
|
917 |
// Offset stored on 48 bits (6 bytes) |
6d5a26e94d9e
unit-tests: Fix `cargo test` on 32-bit platforms
Simon Sapin <simon.sapin@octobus.net>
parents:
46511
diff
changeset
|
918 |
bytes.extend(&(self.offset as u64).to_be_bytes()[2..]); |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
919 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
920 |
bytes.extend(&[0u8; 2]); // Revision flags. |
46887
6d5a26e94d9e
unit-tests: Fix `cargo test` on 32-bit platforms
Simon Sapin <simon.sapin@octobus.net>
parents:
46511
diff
changeset
|
921 |
bytes.extend(&(self.compressed_len as u32).to_be_bytes()); |
6d5a26e94d9e
unit-tests: Fix `cargo test` on 32-bit platforms
Simon Sapin <simon.sapin@octobus.net>
parents:
46511
diff
changeset
|
922 |
bytes.extend(&(self.uncompressed_len as u32).to_be_bytes()); |
48497
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48496
diff
changeset
|
923 |
bytes.extend( |
50990
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50989
diff
changeset
|
924 |
&self.base_revision_or_base_of_delta_chain.0.to_be_bytes(), |
48497
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48496
diff
changeset
|
925 |
); |
50990
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50989
diff
changeset
|
926 |
bytes.extend(&self.link_revision.0.to_be_bytes()); |
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50989
diff
changeset
|
927 |
bytes.extend(&self.p1.0.to_be_bytes()); |
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50989
diff
changeset
|
928 |
bytes.extend(&self.p2.0.to_be_bytes()); |
49148
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
929 |
bytes.extend(self.node.as_bytes()); |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
930 |
bytes.extend(vec![0u8; 12]); |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
931 |
bytes |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
932 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
933 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
934 |
|
48496
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
935 |
pub fn is_inline(index_bytes: &[u8]) -> bool { |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
936 |
IndexHeader::parse(index_bytes) |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
937 |
.expect("too short") |
51212
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents:
51210
diff
changeset
|
938 |
.unwrap() |
48496
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
939 |
.format_flags() |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
940 |
.is_inline() |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
941 |
} |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
942 |
|
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
943 |
pub fn uses_generaldelta(index_bytes: &[u8]) -> bool { |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
944 |
IndexHeader::parse(index_bytes) |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
945 |
.expect("too short") |
51212
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents:
51210
diff
changeset
|
946 |
.unwrap() |
48496
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
947 |
.format_flags() |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
948 |
.uses_generaldelta() |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
949 |
} |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
950 |
|
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
951 |
pub fn get_version(index_bytes: &[u8]) -> u16 { |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
952 |
IndexHeader::parse(index_bytes) |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
953 |
.expect("too short") |
51212
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents:
51210
diff
changeset
|
954 |
.unwrap() |
48496
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
955 |
.format_version() |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
956 |
} |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
957 |
|
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
958 |
#[test] |
48496
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
959 |
fn flags_when_no_inline_flag_test() { |
45604
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
960 |
let bytes = IndexEntryBuilder::new() |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
961 |
.is_first(true) |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
962 |
.with_general_delta(false) |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
963 |
.with_inline(false) |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
964 |
.build(); |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
965 |
|
50003
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents:
49999
diff
changeset
|
966 |
assert!(!is_inline(&bytes)); |
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents:
49999
diff
changeset
|
967 |
assert!(!uses_generaldelta(&bytes)); |
45604
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
968 |
} |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
969 |
|
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
970 |
#[test] |
48496
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
971 |
fn flags_when_inline_flag_test() { |
45604
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
972 |
let bytes = IndexEntryBuilder::new() |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
973 |
.is_first(true) |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
974 |
.with_general_delta(false) |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
975 |
.with_inline(true) |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
976 |
.build(); |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
977 |
|
50003
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents:
49999
diff
changeset
|
978 |
assert!(is_inline(&bytes)); |
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents:
49999
diff
changeset
|
979 |
assert!(!uses_generaldelta(&bytes)); |
45604
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
980 |
} |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
981 |
|
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
982 |
#[test] |
48496
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
983 |
fn flags_when_inline_and_generaldelta_flags_test() { |
45604
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
984 |
let bytes = IndexEntryBuilder::new() |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
985 |
.is_first(true) |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
986 |
.with_general_delta(true) |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
987 |
.with_inline(true) |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
988 |
.build(); |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
989 |
|
50003
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents:
49999
diff
changeset
|
990 |
assert!(is_inline(&bytes)); |
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents:
49999
diff
changeset
|
991 |
assert!(uses_generaldelta(&bytes)); |
45604
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
992 |
} |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
993 |
|
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45596
diff
changeset
|
994 |
#[test] |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
995 |
fn test_offset() { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
996 |
let bytes = IndexEntryBuilder::new().with_offset(1).build(); |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
997 |
let entry = IndexEntry { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
998 |
bytes: &bytes, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
999 |
offset_override: None, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1000 |
}; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1001 |
|
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1002 |
assert_eq!(entry.offset(), 1) |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1003 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1004 |
|
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1005 |
#[test] |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1006 |
fn test_with_overridden_offset() { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1007 |
let bytes = IndexEntryBuilder::new().with_offset(1).build(); |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1008 |
let entry = IndexEntry { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1009 |
bytes: &bytes, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1010 |
offset_override: Some(2), |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1011 |
}; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1012 |
|
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1013 |
assert_eq!(entry.offset(), 2) |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1014 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1015 |
|
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1016 |
#[test] |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1017 |
fn test_compressed_len() { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1018 |
let bytes = IndexEntryBuilder::new().with_compressed_len(1).build(); |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1019 |
let entry = IndexEntry { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1020 |
bytes: &bytes, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1021 |
offset_override: None, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1022 |
}; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1023 |
|
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1024 |
assert_eq!(entry.compressed_len(), 1) |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1025 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1026 |
|
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1027 |
#[test] |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1028 |
fn test_uncompressed_len() { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1029 |
let bytes = IndexEntryBuilder::new().with_uncompressed_len(1).build(); |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1030 |
let entry = IndexEntry { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1031 |
bytes: &bytes, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1032 |
offset_override: None, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1033 |
}; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1034 |
|
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1035 |
assert_eq!(entry.uncompressed_len(), 1) |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1036 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1037 |
|
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1038 |
#[test] |
48497
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48496
diff
changeset
|
1039 |
fn test_base_revision_or_base_of_delta_chain() { |
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48496
diff
changeset
|
1040 |
let bytes = IndexEntryBuilder::new() |
50990
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50989
diff
changeset
|
1041 |
.with_base_revision_or_base_of_delta_chain(Revision(1)) |
48497
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48496
diff
changeset
|
1042 |
.build(); |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1043 |
let entry = IndexEntry { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1044 |
bytes: &bytes, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1045 |
offset_override: None, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1046 |
}; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1047 |
|
50988
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
1048 |
assert_eq!(entry.base_revision_or_base_of_delta_chain(), 1.into()) |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1049 |
} |
48496
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
1050 |
|
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
1051 |
#[test] |
49148
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1052 |
fn link_revision_test() { |
50990
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50989
diff
changeset
|
1053 |
let bytes = IndexEntryBuilder::new() |
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50989
diff
changeset
|
1054 |
.with_link_revision(Revision(123)) |
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50989
diff
changeset
|
1055 |
.build(); |
49148
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1056 |
|
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1057 |
let entry = IndexEntry { |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1058 |
bytes: &bytes, |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1059 |
offset_override: None, |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1060 |
}; |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1061 |
|
50988
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
1062 |
assert_eq!(entry.link_revision(), 123.into()); |
49148
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1063 |
} |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1064 |
|
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1065 |
#[test] |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1066 |
fn p1_test() { |
50990
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50989
diff
changeset
|
1067 |
let bytes = IndexEntryBuilder::new().with_p1(Revision(123)).build(); |
49148
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1068 |
|
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1069 |
let entry = IndexEntry { |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1070 |
bytes: &bytes, |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1071 |
offset_override: None, |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1072 |
}; |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1073 |
|
50988
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
1074 |
assert_eq!(entry.p1(), 123.into()); |
49148
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1075 |
} |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1076 |
|
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1077 |
#[test] |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1078 |
fn p2_test() { |
50990
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50989
diff
changeset
|
1079 |
let bytes = IndexEntryBuilder::new().with_p2(Revision(123)).build(); |
49148
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1080 |
|
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1081 |
let entry = IndexEntry { |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1082 |
bytes: &bytes, |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1083 |
offset_override: None, |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1084 |
}; |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1085 |
|
50988
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
50003
diff
changeset
|
1086 |
assert_eq!(entry.p2(), 123.into()); |
49148
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1087 |
} |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1088 |
|
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1089 |
#[test] |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1090 |
fn node_test() { |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1091 |
let node = Node::from_hex("0123456789012345678901234567890123456789") |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1092 |
.unwrap(); |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1093 |
let bytes = IndexEntryBuilder::new().with_node(node).build(); |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1094 |
|
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1095 |
let entry = IndexEntry { |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1096 |
bytes: &bytes, |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1097 |
offset_override: None, |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1098 |
}; |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1099 |
|
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1100 |
assert_eq!(*entry.hash(), node); |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1101 |
} |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1102 |
|
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49147
diff
changeset
|
1103 |
#[test] |
48496
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
1104 |
fn version_test() { |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
1105 |
let bytes = IndexEntryBuilder::new() |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
1106 |
.is_first(true) |
49147
d200ecb76c72
rust-revlog: change default version from 2 to 1 in test builder
Martin von Zweigbergk <martinvonz@google.com>
parents:
48575
diff
changeset
|
1107 |
.with_version(2) |
48496
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
1108 |
.build(); |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
1109 |
|
49147
d200ecb76c72
rust-revlog: change default version from 2 to 1 in test builder
Martin von Zweigbergk <martinvonz@google.com>
parents:
48575
diff
changeset
|
1110 |
assert_eq!(get_version(&bytes), 2) |
48496
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48238
diff
changeset
|
1111 |
} |
45532
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1112 |
} |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1113 |
|
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1114 |
#[cfg(test)] |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1115 |
pub use tests::IndexEntryBuilder; |