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