Mercurial > hg
annotate rust/hg-core/src/revlog/index.rs @ 51397:b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Python implementation of `headrevsdiff` can be very slow in the worst
case compared with the `heads` computation it replaces, since the
latter is done in Rust.
Even the average case of this Python implementation is still
noticeable in the profiles.
This patch makes the computation much much faster by doing it in Rust.
author | Arseniy Alekseyev <aalekseyev@janestreet.com> |
---|---|
date | Mon, 12 Feb 2024 20:01:27 +0000 |
parents | c4cbb515b006 |
children | 7c6d0b9dde37 |
rev | line source |
---|---|
51220
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1 use std::collections::{HashMap, HashSet}; |
50977
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49930
diff
changeset
|
2 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
|
3 use std::ops::Deref; |
51197
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
4 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
|
5 |
51260
c4f1a790bda8
rust-index: use a `BitVec` instead of plain `Vec` for heads computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51259
diff
changeset
|
6 use bitvec::prelude::*; |
45531
b0d6309ff50c
hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45526
diff
changeset
|
7 use byteorder::{BigEndian, ByteOrder}; |
51189
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
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 |
51189
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
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; |
51209
e9d47e2f5dcf
rust-index: add missing special case for null rev
Raphaël Gomès <rgomes@octobus.net>
parents:
51205
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}; |
51212
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
15 use crate::{ |
51215
a7bba7df9189
rust-index: implement headrevs
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
16 dagops, BaseRevision, FastHashMap, Graph, GraphError, RevlogError, |
a7bba7df9189
rust-index: implement headrevs
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
17 RevlogIndex, UncheckedRevision, |
51212
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
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; |
51189
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
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 |
51218
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
23 #[derive(Debug)] |
48457
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
24 pub struct IndexHeader { |
51191
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents:
51189
diff
changeset
|
25 pub(super) header_bytes: [u8; 4], |
48457
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 |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
28 #[derive(Copy, Clone)] |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
29 pub struct IndexHeaderFlags { |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
30 flags: u16, |
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 |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
33 /// 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
|
34 impl IndexHeaderFlags { |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
35 /// Corresponds to FLAG_INLINE_DATA in python |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
36 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
|
37 self.flags & 1 != 0 |
48457
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
38 } |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
39 /// Corresponds to FLAG_GENERALDELTA in python |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
40 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
|
41 self.flags & 2 != 0 |
48457
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 |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
45 /// Corresponds to the INDEX_HEADER structure, |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
46 /// 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
|
47 impl IndexHeader { |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
48 fn format_flags(&self) -> IndexHeaderFlags { |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
49 // 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
|
50 // be. |
49930
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents:
49926
diff
changeset
|
51 IndexHeaderFlags { |
48457
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
52 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
|
53 } |
48457
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 |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
56 /// The only revlog version currently supported by rhg. |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
57 const REVLOGV1: u16 = 1; |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
58 |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
59 /// Corresponds to `_format_version` in Python. |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
60 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
|
61 BigEndian::read_u16(&self.header_bytes[2..4]) |
48457
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
62 } |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
63 |
51191
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents:
51189
diff
changeset
|
64 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
|
65 if index_bytes.is_empty() { |
51191
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents:
51189
diff
changeset
|
66 return Ok(None); |
48457
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
67 } |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
68 if index_bytes.len() < 4 { |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
69 return Err(HgError::corrupted( |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
70 "corrupted revlog: can't read the index format header", |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
71 )); |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
72 } |
51191
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents:
51189
diff
changeset
|
73 Ok(Some(IndexHeader { |
48457
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
74 header_bytes: { |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
75 let bytes: [u8; 4] = |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
76 index_bytes[0..4].try_into().expect("impossible"); |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
77 bytes |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
78 }, |
51191
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents:
51189
diff
changeset
|
79 })) |
48457
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 } |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
82 |
51188
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
83 /// 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:
50979
diff
changeset
|
84 /// 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:
50979
diff
changeset
|
85 /// 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:
50979
diff
changeset
|
86 struct IndexData { |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
87 /// Immutable bytes, most likely taken from disk |
51233
ca81cd96000a
rust-index: add Sync bound to all relevant mmap-derived values
Raphaël Gomès <rgomes@octobus.net>
parents:
51229
diff
changeset
|
88 bytes: Box<dyn Deref<Target = [u8]> + Send + Sync>, |
51195
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
89 /// 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:
51192
diff
changeset
|
90 /// 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:
51192
diff
changeset
|
91 /// `bytes` field. |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
92 truncation: Option<usize>, |
51188
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
93 /// 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:
50979
diff
changeset
|
94 added: Vec<u8>, |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
95 } |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
96 |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
97 impl IndexData { |
51233
ca81cd96000a
rust-index: add Sync bound to all relevant mmap-derived values
Raphaël Gomès <rgomes@octobus.net>
parents:
51229
diff
changeset
|
98 pub fn new(bytes: Box<dyn Deref<Target = [u8]> + Send + Sync>) -> Self { |
51188
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
99 Self { |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
100 bytes, |
51195
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
101 truncation: None, |
51188
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
102 added: vec![], |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
103 } |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
104 } |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
105 |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
106 pub fn len(&self) -> usize { |
51195
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
107 match self.truncation { |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
108 Some(truncation) => truncation + self.added.len(), |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
109 None => self.bytes.len() + self.added.len(), |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
110 } |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
111 } |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
112 |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
113 fn remove( |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
114 &mut self, |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
115 rev: Revision, |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
116 offsets: Option<&[usize]>, |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
117 ) -> Result<(), RevlogError> { |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
118 let rev = rev.0 as usize; |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
119 let truncation = if let Some(offsets) = offsets { |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
120 offsets[rev] |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
121 } else { |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
122 rev * INDEX_ENTRY_SIZE |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
123 }; |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
124 if truncation < self.bytes.len() { |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
125 self.truncation = Some(truncation); |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
126 self.added.clear(); |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
127 } else { |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
128 self.added.truncate(truncation - self.bytes.len()); |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
129 } |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
130 Ok(()) |
51188
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
131 } |
51205
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
132 |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
133 fn is_new(&self) -> bool { |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
134 self.bytes.is_empty() |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
135 } |
51188
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
136 } |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
137 |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
138 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:
50979
diff
changeset
|
139 type Output = [u8]; |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
140 |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
141 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:
50979
diff
changeset
|
142 let start = index.start; |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
143 let end = index.end; |
51195
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
144 let immutable_len = match self.truncation { |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
145 Some(truncation) => truncation, |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
146 None => self.bytes.len(), |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
147 }; |
51188
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
148 if start < immutable_len { |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
149 if end > immutable_len { |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
150 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:
50979
diff
changeset
|
151 } |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
152 &self.bytes[index] |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
153 } else { |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
154 &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:
50979
diff
changeset
|
155 } |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
156 } |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
157 } |
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
158 |
51205
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
159 #[derive(Debug, PartialEq, Eq)] |
51189
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
160 pub struct RevisionDataParams { |
51192
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
161 pub flags: u16, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
162 pub data_offset: u64, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
163 pub data_compressed_length: i32, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
164 pub data_uncompressed_length: i32, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
165 pub data_delta_base: i32, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
166 pub link_rev: i32, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
167 pub parent_rev_1: i32, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
168 pub parent_rev_2: i32, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
169 pub node_id: [u8; NODE_BYTES_LENGTH], |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
170 pub _sidedata_offset: u64, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
171 pub _sidedata_compressed_length: i32, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
172 pub data_compression_mode: u8, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
173 pub _sidedata_compression_mode: u8, |
65c9032e2e5a
rust-index: synchronize append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51191
diff
changeset
|
174 pub _rank: i32, |
51189
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
175 } |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
176 |
51205
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
177 impl Default for RevisionDataParams { |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
178 fn default() -> Self { |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
179 Self { |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
180 flags: 0, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
181 data_offset: 0, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
182 data_compressed_length: 0, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
183 data_uncompressed_length: 0, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
184 data_delta_base: -1, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
185 link_rev: -1, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
186 parent_rev_1: -1, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
187 parent_rev_2: -1, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
188 node_id: [0; NODE_BYTES_LENGTH], |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
189 _sidedata_offset: 0, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
190 _sidedata_compressed_length: 0, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
191 data_compression_mode: COMPRESSION_MODE_INLINE, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
192 _sidedata_compression_mode: COMPRESSION_MODE_INLINE, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
193 _rank: -1, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
194 } |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
195 } |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
196 } |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
197 |
51189
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
198 #[derive(BytesCast)] |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
199 #[repr(C)] |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
200 pub struct RevisionDataV1 { |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
201 data_offset_or_flags: unaligned::U64Be, |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
202 data_compressed_length: unaligned::I32Be, |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
203 data_uncompressed_length: unaligned::I32Be, |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
204 data_delta_base: unaligned::I32Be, |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
205 link_rev: unaligned::I32Be, |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
206 parent_rev_1: unaligned::I32Be, |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
207 parent_rev_2: unaligned::I32Be, |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
208 node_id: [u8; STORED_NODE_ID_BYTES], |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
209 } |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
210 |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
211 fn _static_assert_size_of_revision_data_v1() { |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
212 let _ = std::mem::transmute::<RevisionDataV1, [u8; 64]>; |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
213 } |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
214 |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
215 impl RevisionDataParams { |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
216 pub fn validate(&self) -> Result<(), RevlogError> { |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
217 if self.flags & !REVIDX_KNOWN_FLAGS != 0 { |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
218 return Err(RevlogError::corrupted(format!( |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
219 "unknown revlog index flags: {}", |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
220 self.flags |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
221 ))); |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
222 } |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
223 if self.data_compression_mode != COMPRESSION_MODE_INLINE { |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
224 return Err(RevlogError::corrupted(format!( |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
225 "invalid data compression mode: {}", |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
226 self.data_compression_mode |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
227 ))); |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
228 } |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
229 // FIXME isn't this only for v2 or changelog v2? |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
230 if self._sidedata_compression_mode != COMPRESSION_MODE_INLINE { |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
231 return Err(RevlogError::corrupted(format!( |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
232 "invalid sidedata compression mode: {}", |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
233 self._sidedata_compression_mode |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
234 ))); |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
235 } |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
236 Ok(()) |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
237 } |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
238 |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
239 pub fn into_v1(self) -> RevisionDataV1 { |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
240 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:
51188
diff
changeset
|
241 let mut node_id = [0; STORED_NODE_ID_BYTES]; |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
242 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:
51188
diff
changeset
|
243 RevisionDataV1 { |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
244 data_offset_or_flags: data_offset_or_flags.into(), |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
245 data_compressed_length: self.data_compressed_length.into(), |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
246 data_uncompressed_length: self.data_uncompressed_length.into(), |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
247 data_delta_base: self.data_delta_base.into(), |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
248 link_rev: self.link_rev.into(), |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
249 parent_rev_1: self.parent_rev_1.into(), |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
250 parent_rev_2: self.parent_rev_2.into(), |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
251 node_id, |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
252 } |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
253 } |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
254 } |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
255 |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
256 /// 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
|
257 pub struct Index { |
51188
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
258 bytes: IndexData, |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
259 /// 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
|
260 /// Only needed when the index is interleaved with data. |
51197
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
261 offsets: RwLock<Option<Vec<usize>>>, |
48458
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48457
diff
changeset
|
262 uses_generaldelta: bool, |
51197
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
263 is_inline: bool, |
51234
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
264 /// Cache of (head_revisions, filtered_revisions) |
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
265 /// |
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
266 /// The head revisions in this index, kept in sync. Should |
51215
a7bba7df9189
rust-index: implement headrevs
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
267 /// be accessed via the [`Self::head_revs`] method. |
51234
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
268 /// The last filtered revisions in this index, used to make sure |
51216
9f876765cbe2
rust-index: add support for `headrevsfiltered`
Raphaël Gomès <rgomes@octobus.net>
parents:
51215
diff
changeset
|
269 /// we haven't changed filters when returning the cached `head_revs`. |
51234
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
270 head_revs: RwLock<(Vec<Revision>, HashSet<Revision>)>, |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
271 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
272 |
50977
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49930
diff
changeset
|
273 impl Debug for Index { |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49930
diff
changeset
|
274 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
|
275 f.debug_struct("Index") |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49930
diff
changeset
|
276 .field("offsets", &self.offsets) |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49930
diff
changeset
|
277 .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
|
278 .finish() |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49930
diff
changeset
|
279 } |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49930
diff
changeset
|
280 } |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49930
diff
changeset
|
281 |
50978
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50977
diff
changeset
|
282 impl Graph for Index { |
51257
e74dd6d73cb5
rust-index: allow inlining `parents` across crates
Raphaël Gomès <rgomes@octobus.net>
parents:
51236
diff
changeset
|
283 #[inline(always)] |
50978
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50977
diff
changeset
|
284 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:
50977
diff
changeset
|
285 let err = || GraphError::ParentOutOfRange(rev); |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50977
diff
changeset
|
286 match self.get_entry(rev) { |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50977
diff
changeset
|
287 Some(entry) => { |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50977
diff
changeset
|
288 // 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:
50977
diff
changeset
|
289 // before returning |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50977
diff
changeset
|
290 Ok([ |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50977
diff
changeset
|
291 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:
50977
diff
changeset
|
292 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:
50977
diff
changeset
|
293 ]) |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50977
diff
changeset
|
294 } |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50977
diff
changeset
|
295 None => Ok([NULL_REVISION, NULL_REVISION]), |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50977
diff
changeset
|
296 } |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50977
diff
changeset
|
297 } |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50977
diff
changeset
|
298 } |
27e773aa607d
rust: implement the `Graph` trait for all revlogs
Raphaël Gomès <rgomes@octobus.net>
parents:
50977
diff
changeset
|
299 |
51212
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
300 /// A cache suitable for find_snapshots |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
301 /// |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
302 /// 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:
51211
diff
changeset
|
303 /// values sets of [`BaseRevision`] |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
304 /// |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
305 /// 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:
51211
diff
changeset
|
306 /// 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:
51211
diff
changeset
|
307 /// 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:
51211
diff
changeset
|
308 /// 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:
51211
diff
changeset
|
309 pub trait SnapshotsCache { |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
310 fn insert_for( |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
311 &mut self, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
312 rev: BaseRevision, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
313 value: BaseRevision, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
314 ) -> Result<(), RevlogError>; |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
315 } |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
316 |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
317 impl SnapshotsCache for FastHashMap<BaseRevision, HashSet<BaseRevision>> { |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
318 fn insert_for( |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
319 &mut self, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
320 rev: BaseRevision, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
321 value: BaseRevision, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
322 ) -> Result<(), RevlogError> { |
51272
c4cbb515b006
rust-clippy: apply some more trivial fixes
Raphaël Gomès <rgomes@octobus.net>
parents:
51264
diff
changeset
|
323 let all_values = self.entry(rev).or_default(); |
51212
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
324 all_values.insert(value); |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
325 Ok(()) |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
326 } |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
327 } |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
328 |
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
|
329 impl Index { |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
330 /// Create an index from bytes. |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
331 /// 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
|
332 pub fn new( |
51233
ca81cd96000a
rust-index: add Sync bound to all relevant mmap-derived values
Raphaël Gomès <rgomes@octobus.net>
parents:
51229
diff
changeset
|
333 bytes: Box<dyn Deref<Target = [u8]> + Send + Sync>, |
51191
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents:
51189
diff
changeset
|
334 default_header: IndexHeader, |
47963
001d747c2baf
rust: Return HgError instead of RevlogError in revlog constructors
Simon Sapin <simon.sapin@octobus.net>
parents:
46887
diff
changeset
|
335 ) -> Result<Self, HgError> { |
51191
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents:
51189
diff
changeset
|
336 let header = |
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents:
51189
diff
changeset
|
337 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
|
338 |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
339 if header.format_version() != IndexHeader::REVLOGV1 { |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
340 // 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
|
341 // requirement. |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
342 return Err(HgError::corrupted("unsupported revlog version")); |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
343 } |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
344 |
48458
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48457
diff
changeset
|
345 // 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
|
346 // 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
|
347 // 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
|
348 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
|
349 |
48457
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
350 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
|
351 let mut offset: usize = 0; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
352 let mut offsets = Vec::new(); |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
353 |
45590
11f3c3f408fd
hg-core: minor code style change (D8958#inline-14993 followup)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45536
diff
changeset
|
354 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
|
355 offsets.push(offset); |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
356 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
|
357 let entry = IndexEntry { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
358 bytes: &bytes[offset..end], |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
359 offset_override: None, |
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 |
48543
0a4ac916673e
rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents:
48458
diff
changeset
|
362 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
|
363 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
364 |
45602
1cef583541c0
hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents:
45601
diff
changeset
|
365 if offset == bytes.len() { |
1cef583541c0
hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents:
45601
diff
changeset
|
366 Ok(Self { |
51188
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
367 bytes: IndexData::new(bytes), |
51197
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
368 offsets: RwLock::new(Some(offsets)), |
48458
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48457
diff
changeset
|
369 uses_generaldelta, |
51197
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
370 is_inline: true, |
51234
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
371 head_revs: RwLock::new((vec![], HashSet::new())), |
45602
1cef583541c0
hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents:
45601
diff
changeset
|
372 }) |
1cef583541c0
hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents:
45601
diff
changeset
|
373 } else { |
49930
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents:
49926
diff
changeset
|
374 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
|
375 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
376 } else { |
45602
1cef583541c0
hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents:
45601
diff
changeset
|
377 Ok(Self { |
51188
1ef4a36a934d
rust-index: add an abstraction to support bytes added at runtimes
Raphaël Gomès <rgomes@octobus.net>
parents:
50979
diff
changeset
|
378 bytes: IndexData::new(bytes), |
51197
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
379 offsets: RwLock::new(None), |
48458
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48457
diff
changeset
|
380 uses_generaldelta, |
51197
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
381 is_inline: false, |
51234
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
382 head_revs: RwLock::new((vec![], HashSet::new())), |
45602
1cef583541c0
hg-core: return Err if `offset != bytes.len()`
Antoine cezar<acezar@chwitlabs.fr>
parents:
45601
diff
changeset
|
383 }) |
45526
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 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
386 |
48458
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48457
diff
changeset
|
387 pub fn uses_generaldelta(&self) -> bool { |
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48457
diff
changeset
|
388 self.uses_generaldelta |
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48457
diff
changeset
|
389 } |
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48457
diff
changeset
|
390 |
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
|
391 /// 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
|
392 pub fn is_inline(&self) -> bool { |
51197
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
393 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
|
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 |
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 /// 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
|
397 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
|
398 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
|
399 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
|
400 } |
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 &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
|
402 } |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45593
diff
changeset
|
403 |
45536
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45531
diff
changeset
|
404 /// 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
|
405 pub fn len(&self) -> usize { |
51264
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
406 if self.is_inline() { |
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
407 (*self.get_offsets()) |
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
408 .as_ref() |
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
409 .expect("inline should have offsets") |
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
410 .len() |
45536
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45531
diff
changeset
|
411 } else { |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45531
diff
changeset
|
412 self.bytes.len() / INDEX_ENTRY_SIZE |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45531
diff
changeset
|
413 } |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45531
diff
changeset
|
414 } |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45531
diff
changeset
|
415 |
51197
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
416 pub fn get_offsets(&self) -> RwLockReadGuard<Option<Vec<usize>>> { |
51264
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
417 assert!(self.is_inline()); |
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
418 { |
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
419 // Wrap in a block to drop the read guard |
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
420 // TODO perf? |
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
421 let mut offsets = self.offsets.write().unwrap(); |
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
422 if offsets.is_none() { |
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
423 offsets.replace(inline_scan(&self.bytes.bytes).1); |
51197
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
424 } |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
425 } |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
426 self.offsets.read().unwrap() |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
427 } |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
428 |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
429 pub fn get_offsets_mut(&mut self) -> RwLockWriteGuard<Option<Vec<usize>>> { |
51264
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
430 assert!(self.is_inline()); |
51197
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
431 let mut offsets = self.offsets.write().unwrap(); |
51264
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
432 if offsets.is_none() { |
51197
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
433 offsets.replace(inline_scan(&self.bytes.bytes).1); |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
434 } |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
435 offsets |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
436 } |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
437 |
45536
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45531
diff
changeset
|
438 /// 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
|
439 pub fn is_empty(&self) -> bool { |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45531
diff
changeset
|
440 self.len() == 0 |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45531
diff
changeset
|
441 } |
639f33f22faf
hg-core: add a `ListRevTrackedFiles` operation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45531
diff
changeset
|
442 |
51203
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51198
diff
changeset
|
443 /// 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:
51198
diff
changeset
|
444 /// 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:
51198
diff
changeset
|
445 /// |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51198
diff
changeset
|
446 /// 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:
51198
diff
changeset
|
447 /// 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
|
448 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
|
449 if rev == NULL_REVISION { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
450 return None; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
451 } |
51264
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
452 Some(if self.is_inline() { |
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
453 self.get_entry_inline(rev) |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
454 } else { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
455 self.get_entry_separated(rev) |
50977
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49930
diff
changeset
|
456 }) |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
457 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
458 |
51203
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51198
diff
changeset
|
459 /// 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:
51198
diff
changeset
|
460 /// |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51198
diff
changeset
|
461 /// 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:
51198
diff
changeset
|
462 /// returned. |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51198
diff
changeset
|
463 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:
51198
diff
changeset
|
464 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:
51198
diff
changeset
|
465 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:
51198
diff
changeset
|
466 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:
51198
diff
changeset
|
467 &bytes[4..] |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51198
diff
changeset
|
468 } else { |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51198
diff
changeset
|
469 bytes |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51198
diff
changeset
|
470 } |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51198
diff
changeset
|
471 }) |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51198
diff
changeset
|
472 } |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51198
diff
changeset
|
473 |
51205
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
474 pub fn entry_as_params( |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
475 &self, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
476 rev: UncheckedRevision, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
477 ) -> Option<RevisionDataParams> { |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
478 let rev = self.check_revision(rev)?; |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
479 self.get_entry(rev).map(|e| RevisionDataParams { |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
480 flags: e.flags(), |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
481 data_offset: if rev.0 == 0 && !self.bytes.is_new() { |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
482 e.flags() as u64 |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
483 } else { |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
484 e.raw_offset() |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
485 }, |
51236
eb676c35a29b
rust-index: support `unionrepo`'s compressed length hack
Raphaël Gomès <rgomes@octobus.net>
parents:
51235
diff
changeset
|
486 data_compressed_length: e |
eb676c35a29b
rust-index: support `unionrepo`'s compressed length hack
Raphaël Gomès <rgomes@octobus.net>
parents:
51235
diff
changeset
|
487 .compressed_len() |
eb676c35a29b
rust-index: support `unionrepo`'s compressed length hack
Raphaël Gomès <rgomes@octobus.net>
parents:
51235
diff
changeset
|
488 .try_into() |
eb676c35a29b
rust-index: support `unionrepo`'s compressed length hack
Raphaël Gomès <rgomes@octobus.net>
parents:
51235
diff
changeset
|
489 .unwrap_or_else(|_| { |
eb676c35a29b
rust-index: support `unionrepo`'s compressed length hack
Raphaël Gomès <rgomes@octobus.net>
parents:
51235
diff
changeset
|
490 // Python's `unionrepo` sets the compressed length to be |
eb676c35a29b
rust-index: support `unionrepo`'s compressed length hack
Raphaël Gomès <rgomes@octobus.net>
parents:
51235
diff
changeset
|
491 // `-1` (or `u32::MAX` if transmuted to `u32`) because it |
eb676c35a29b
rust-index: support `unionrepo`'s compressed length hack
Raphaël Gomès <rgomes@octobus.net>
parents:
51235
diff
changeset
|
492 // cannot know the correct compressed length of a given |
eb676c35a29b
rust-index: support `unionrepo`'s compressed length hack
Raphaël Gomès <rgomes@octobus.net>
parents:
51235
diff
changeset
|
493 // revision. I'm not sure if this is true, but having this |
eb676c35a29b
rust-index: support `unionrepo`'s compressed length hack
Raphaël Gomès <rgomes@octobus.net>
parents:
51235
diff
changeset
|
494 // edge case won't hurt other use cases, let's handle it. |
eb676c35a29b
rust-index: support `unionrepo`'s compressed length hack
Raphaël Gomès <rgomes@octobus.net>
parents:
51235
diff
changeset
|
495 assert_eq!(e.compressed_len(), u32::MAX); |
eb676c35a29b
rust-index: support `unionrepo`'s compressed length hack
Raphaël Gomès <rgomes@octobus.net>
parents:
51235
diff
changeset
|
496 NULL_REVISION.0 |
eb676c35a29b
rust-index: support `unionrepo`'s compressed length hack
Raphaël Gomès <rgomes@octobus.net>
parents:
51235
diff
changeset
|
497 }), |
51205
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
498 data_uncompressed_length: e.uncompressed_len(), |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
499 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:
51203
diff
changeset
|
500 link_rev: e.link_revision().0, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
501 parent_rev_1: e.p1().0, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
502 parent_rev_2: e.p2().0, |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
503 node_id: e.hash().as_bytes().try_into().unwrap(), |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
504 ..Default::default() |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
505 }) |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
506 } |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
507 |
51264
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
508 fn get_entry_inline(&self, rev: Revision) -> IndexEntry { |
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
509 let offsets = &self.get_offsets(); |
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
510 let offsets = offsets.as_ref().expect("inline should have offsets"); |
50979
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50978
diff
changeset
|
511 let start = offsets[rev.0 as usize]; |
50977
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49930
diff
changeset
|
512 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
|
513 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
|
514 |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
515 // 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
|
516 let offset_override = Some(end); |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
517 |
50977
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49930
diff
changeset
|
518 IndexEntry { |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
519 bytes, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
520 offset_override, |
50977
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49930
diff
changeset
|
521 } |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
522 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
523 |
50977
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49930
diff
changeset
|
524 fn get_entry_separated(&self, rev: Revision) -> IndexEntry { |
50979
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50978
diff
changeset
|
525 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
|
526 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
|
527 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
|
528 |
45591
f38adf8b0711
hg-core: Explain offset override of first revision
Antoine cezar<acezar@chwitlabs.fr>
parents:
45590
diff
changeset
|
529 // 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
|
530 // for the index's metadata (saving space because it is always 0) |
50979
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50978
diff
changeset
|
531 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
|
532 |
50977
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49930
diff
changeset
|
533 IndexEntry { |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
534 bytes, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
535 offset_override, |
50977
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49930
diff
changeset
|
536 } |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
537 } |
51189
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
538 |
51218
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
539 fn null_entry(&self) -> IndexEntry { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
540 IndexEntry { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
541 bytes: &[0; INDEX_ENTRY_SIZE], |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
542 offset_override: Some(0), |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
543 } |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
544 } |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
545 |
51215
a7bba7df9189
rust-index: implement headrevs
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
546 /// Return the head revisions of this index |
51234
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
547 pub fn head_revs(&self) -> Result<Vec<Revision>, GraphError> { |
51261
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51260
diff
changeset
|
548 self.head_revs_filtered(&HashSet::new(), false) |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51260
diff
changeset
|
549 .map(|h| h.unwrap()) |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51260
diff
changeset
|
550 } |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51260
diff
changeset
|
551 |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51260
diff
changeset
|
552 /// Python-specific shortcut to save on PyList creation |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51260
diff
changeset
|
553 pub fn head_revs_shortcut( |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51260
diff
changeset
|
554 &self, |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51260
diff
changeset
|
555 ) -> Result<Option<Vec<Revision>>, GraphError> { |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51260
diff
changeset
|
556 self.head_revs_filtered(&HashSet::new(), true) |
51216
9f876765cbe2
rust-index: add support for `headrevsfiltered`
Raphaël Gomès <rgomes@octobus.net>
parents:
51215
diff
changeset
|
557 } |
9f876765cbe2
rust-index: add support for `headrevsfiltered`
Raphaël Gomès <rgomes@octobus.net>
parents:
51215
diff
changeset
|
558 |
51397
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
559 /// Return the heads removed and added by advancing from `begin` to `end`. |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
560 /// In revset language, we compute: |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
561 /// - `heads(:begin)-heads(:end)` |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
562 /// - `heads(:end)-heads(:begin)` |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
563 pub fn head_revs_diff( |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
564 &self, |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
565 begin: Revision, |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
566 end: Revision, |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
567 ) -> Result<(Vec<Revision>, Vec<Revision>), GraphError> { |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
568 let mut heads_added = vec![]; |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
569 let mut heads_removed = vec![]; |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
570 |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
571 let mut acc = HashSet::new(); |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
572 let Revision(begin) = begin; |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
573 let Revision(end) = end; |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
574 let mut i = end; |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
575 |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
576 while i > begin { |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
577 // acc invariant: |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
578 // `j` is in the set iff `j <= i` and it has children |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
579 // among `i+1..end` (inclusive) |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
580 if !acc.remove(&i) { |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
581 heads_added.push(Revision(i)); |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
582 } |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
583 for Revision(parent) in self.parents(Revision(i))? { |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
584 acc.insert(parent); |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
585 } |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
586 i -= 1; |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
587 } |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
588 |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
589 // At this point `acc` contains old revisions that gained new children. |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
590 // We need to check if they had any children before. If not, those |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
591 // revisions are the removed heads. |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
592 while !acc.is_empty() { |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
593 // acc invariant: |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
594 // `j` is in the set iff `j <= i` and it has children |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
595 // among `begin+1..end`, but not among `i+1..begin` (inclusive) |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
596 |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
597 assert!(i >= -1); // yes, `-1` can also be a head if the repo is empty |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
598 if acc.remove(&i) { |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
599 heads_removed.push(Revision(i)); |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
600 } |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
601 for Revision(parent) in self.parents(Revision(i))? { |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
602 acc.remove(&parent); |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
603 } |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
604 i -= 1; |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
605 } |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
606 |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
607 Ok((heads_removed, heads_added)) |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
608 } |
b01e7d97e167
revlog: add a Rust implementation of `headrevsdiff`
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
51272
diff
changeset
|
609 |
51216
9f876765cbe2
rust-index: add support for `headrevsfiltered`
Raphaël Gomès <rgomes@octobus.net>
parents:
51215
diff
changeset
|
610 /// Return the head revisions of this index |
9f876765cbe2
rust-index: add support for `headrevsfiltered`
Raphaël Gomès <rgomes@octobus.net>
parents:
51215
diff
changeset
|
611 pub fn head_revs_filtered( |
51234
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
612 &self, |
51216
9f876765cbe2
rust-index: add support for `headrevsfiltered`
Raphaël Gomès <rgomes@octobus.net>
parents:
51215
diff
changeset
|
613 filtered_revs: &HashSet<Revision>, |
51261
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51260
diff
changeset
|
614 py_shortcut: bool, |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51260
diff
changeset
|
615 ) -> Result<Option<Vec<Revision>>, GraphError> { |
51234
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
616 { |
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
617 let guard = self |
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
618 .head_revs |
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
619 .read() |
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
620 .expect("RwLock on Index.head_revs should not be poisoned"); |
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
621 let self_head_revs = &guard.0; |
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
622 let self_filtered_revs = &guard.1; |
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
623 if !self_head_revs.is_empty() |
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
624 && filtered_revs == self_filtered_revs |
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
625 { |
51261
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51260
diff
changeset
|
626 if py_shortcut { |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51260
diff
changeset
|
627 // Don't copy the revs since we've already cached them |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51260
diff
changeset
|
628 // on the Python side. |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51260
diff
changeset
|
629 return Ok(None); |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51260
diff
changeset
|
630 } else { |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51260
diff
changeset
|
631 return Ok(Some(self_head_revs.to_owned())); |
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51260
diff
changeset
|
632 } |
51234
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
633 } |
51215
a7bba7df9189
rust-index: implement headrevs
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
634 } |
51259
ed6683d4cb29
rust-index: implement faster retain heads using a vec instead of a hashset
Raphaël Gomès <rgomes@octobus.net>
parents:
51257
diff
changeset
|
635 |
ed6683d4cb29
rust-index: implement faster retain heads using a vec instead of a hashset
Raphaël Gomès <rgomes@octobus.net>
parents:
51257
diff
changeset
|
636 let as_vec = if self.is_empty() { |
ed6683d4cb29
rust-index: implement faster retain heads using a vec instead of a hashset
Raphaël Gomès <rgomes@octobus.net>
parents:
51257
diff
changeset
|
637 vec![NULL_REVISION] |
ed6683d4cb29
rust-index: implement faster retain heads using a vec instead of a hashset
Raphaël Gomès <rgomes@octobus.net>
parents:
51257
diff
changeset
|
638 } else { |
51260
c4f1a790bda8
rust-index: use a `BitVec` instead of plain `Vec` for heads computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51259
diff
changeset
|
639 let mut not_heads = bitvec![0; self.len()]; |
c4f1a790bda8
rust-index: use a `BitVec` instead of plain `Vec` for heads computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51259
diff
changeset
|
640 dagops::retain_heads_fast( |
c4f1a790bda8
rust-index: use a `BitVec` instead of plain `Vec` for heads computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51259
diff
changeset
|
641 self, |
c4f1a790bda8
rust-index: use a `BitVec` instead of plain `Vec` for heads computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51259
diff
changeset
|
642 not_heads.as_mut_bitslice(), |
c4f1a790bda8
rust-index: use a `BitVec` instead of plain `Vec` for heads computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51259
diff
changeset
|
643 filtered_revs, |
c4f1a790bda8
rust-index: use a `BitVec` instead of plain `Vec` for heads computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51259
diff
changeset
|
644 )?; |
51259
ed6683d4cb29
rust-index: implement faster retain heads using a vec instead of a hashset
Raphaël Gomès <rgomes@octobus.net>
parents:
51257
diff
changeset
|
645 not_heads |
ed6683d4cb29
rust-index: implement faster retain heads using a vec instead of a hashset
Raphaël Gomès <rgomes@octobus.net>
parents:
51257
diff
changeset
|
646 .into_iter() |
ed6683d4cb29
rust-index: implement faster retain heads using a vec instead of a hashset
Raphaël Gomès <rgomes@octobus.net>
parents:
51257
diff
changeset
|
647 .enumerate() |
ed6683d4cb29
rust-index: implement faster retain heads using a vec instead of a hashset
Raphaël Gomès <rgomes@octobus.net>
parents:
51257
diff
changeset
|
648 .filter_map(|(idx, is_not_head)| { |
ed6683d4cb29
rust-index: implement faster retain heads using a vec instead of a hashset
Raphaël Gomès <rgomes@octobus.net>
parents:
51257
diff
changeset
|
649 if is_not_head { |
ed6683d4cb29
rust-index: implement faster retain heads using a vec instead of a hashset
Raphaël Gomès <rgomes@octobus.net>
parents:
51257
diff
changeset
|
650 None |
ed6683d4cb29
rust-index: implement faster retain heads using a vec instead of a hashset
Raphaël Gomès <rgomes@octobus.net>
parents:
51257
diff
changeset
|
651 } else { |
ed6683d4cb29
rust-index: implement faster retain heads using a vec instead of a hashset
Raphaël Gomès <rgomes@octobus.net>
parents:
51257
diff
changeset
|
652 Some(Revision(idx as BaseRevision)) |
ed6683d4cb29
rust-index: implement faster retain heads using a vec instead of a hashset
Raphaël Gomès <rgomes@octobus.net>
parents:
51257
diff
changeset
|
653 } |
ed6683d4cb29
rust-index: implement faster retain heads using a vec instead of a hashset
Raphaël Gomès <rgomes@octobus.net>
parents:
51257
diff
changeset
|
654 }) |
ed6683d4cb29
rust-index: implement faster retain heads using a vec instead of a hashset
Raphaël Gomès <rgomes@octobus.net>
parents:
51257
diff
changeset
|
655 .collect() |
ed6683d4cb29
rust-index: implement faster retain heads using a vec instead of a hashset
Raphaël Gomès <rgomes@octobus.net>
parents:
51257
diff
changeset
|
656 }; |
51234
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
657 *self |
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
658 .head_revs |
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
659 .write() |
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
660 .expect("RwLock on Index.head_revs should not be poisoned") = |
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
661 (as_vec.to_owned(), filtered_revs.to_owned()); |
51261
9088c6d65ef6
rust-index-cpython: cache the heads' PyList representation
Raphaël Gomès <rgomes@octobus.net>
parents:
51260
diff
changeset
|
662 Ok(Some(as_vec)) |
51215
a7bba7df9189
rust-index: implement headrevs
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
663 } |
a7bba7df9189
rust-index: implement headrevs
Raphaël Gomès <rgomes@octobus.net>
parents:
51213
diff
changeset
|
664 |
51213
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
665 /// Obtain the delta chain for a revision. |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
666 /// |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
667 /// `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:
51212
diff
changeset
|
668 /// stop at the base of the chain. |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
669 /// |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
670 /// 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:
51212
diff
changeset
|
671 /// 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:
51212
diff
changeset
|
672 /// `stoprev` was hit. |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
673 pub fn delta_chain( |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
674 &self, |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
675 rev: Revision, |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
676 stop_rev: Option<Revision>, |
51235
456e0fe702e8
rust-index: honour incoming using_general_delta in `deltachain`
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51234
diff
changeset
|
677 using_general_delta: Option<bool>, |
51213
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
678 ) -> Result<(Vec<Revision>, bool), HgError> { |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
679 let mut current_rev = rev; |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
680 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:
51212
diff
changeset
|
681 let mut chain = vec![]; |
51235
456e0fe702e8
rust-index: honour incoming using_general_delta in `deltachain`
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51234
diff
changeset
|
682 let using_general_delta = |
456e0fe702e8
rust-index: honour incoming using_general_delta in `deltachain`
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51234
diff
changeset
|
683 using_general_delta.unwrap_or_else(|| self.uses_generaldelta()); |
51213
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
684 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:
51212
diff
changeset
|
685 && 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:
51212
diff
changeset
|
686 { |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
687 chain.push(current_rev); |
51235
456e0fe702e8
rust-index: honour incoming using_general_delta in `deltachain`
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51234
diff
changeset
|
688 let new_rev = if using_general_delta { |
51213
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
689 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:
51212
diff
changeset
|
690 } else { |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
691 UncheckedRevision(current_rev.0 - 1) |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
692 }; |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
693 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:
51212
diff
changeset
|
694 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:
51212
diff
changeset
|
695 })?; |
51218
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
696 if current_rev.0 == NULL_REVISION.0 { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
697 break; |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
698 } |
51213
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
699 entry = self.get_entry(current_rev).unwrap() |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
700 } |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
701 |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
702 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:
51212
diff
changeset
|
703 true |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
704 } else { |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
705 chain.push(current_rev); |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
706 false |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
707 }; |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
708 chain.reverse(); |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
709 Ok((chain, stopped)) |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
710 } |
62e39bef36ca
rust-index: add support for delta-chain computation
Raphaël Gomès <rgomes@octobus.net>
parents:
51212
diff
changeset
|
711 |
51212
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
712 pub fn find_snapshots( |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
713 &self, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
714 start_rev: UncheckedRevision, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
715 end_rev: UncheckedRevision, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
716 cache: &mut impl SnapshotsCache, |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
717 ) -> Result<(), RevlogError> { |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
718 let mut start_rev = start_rev.0; |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
719 let mut end_rev = end_rev.0; |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
720 end_rev += 1; |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
721 let len = self.len().try_into().unwrap(); |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
722 if end_rev > len { |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
723 end_rev = len; |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
724 } |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
725 if start_rev < 0 { |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
726 start_rev = 0; |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
727 } |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
728 for rev in start_rev..end_rev { |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
729 if !self.is_snapshot_unchecked(Revision(rev))? { |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
730 continue; |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
731 } |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
732 let mut base = self |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
733 .get_entry(Revision(rev)) |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
734 .unwrap() |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
735 .base_revision_or_base_of_delta_chain(); |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
736 if base.0 == rev { |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
737 base = NULL_REVISION.into(); |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
738 } |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
739 cache.insert_for(base.0, rev)?; |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
740 } |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
741 Ok(()) |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
742 } |
9b06e7f32bc5
rust-index: add support for `find_snapshots`
Raphaël Gomès <rgomes@octobus.net>
parents:
51211
diff
changeset
|
743 |
51234
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
744 fn clear_head_revs(&self) { |
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
745 self.head_revs |
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
746 .write() |
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
747 .expect("RwLock on Index.head_revs should not be poisoined") |
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
748 .0 |
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
749 .clear() |
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
750 } |
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
751 |
51189
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
752 /// 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:
51188
diff
changeset
|
753 pub fn append( |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
754 &mut self, |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
755 revision_data: RevisionDataParams, |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
756 ) -> Result<(), RevlogError> { |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
757 revision_data.validate()?; |
51264
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
758 if self.is_inline() { |
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
759 let new_offset = self.bytes.len(); |
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
760 if let Some(offsets) = &mut *self.get_offsets_mut() { |
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
761 offsets.push(new_offset) |
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
762 } |
51189
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
763 } |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
764 self.bytes.added.extend(revision_data.into_v1().as_bytes()); |
51234
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
765 self.clear_head_revs(); |
51189
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
766 Ok(()) |
b4d152a28742
rust-index: add append method
Raphaël Gomès <rgomes@octobus.net>
parents:
51188
diff
changeset
|
767 } |
51195
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
768 |
51198
51cc12158f97
rust-index: add `pack_header` support
Raphaël Gomès <rgomes@octobus.net>
parents:
51197
diff
changeset
|
769 pub fn pack_header(&self, header: i32) -> [u8; 4] { |
51cc12158f97
rust-index: add `pack_header` support
Raphaël Gomès <rgomes@octobus.net>
parents:
51197
diff
changeset
|
770 header.to_be_bytes() |
51cc12158f97
rust-index: add `pack_header` support
Raphaël Gomès <rgomes@octobus.net>
parents:
51197
diff
changeset
|
771 } |
51cc12158f97
rust-index: add `pack_header` support
Raphaël Gomès <rgomes@octobus.net>
parents:
51197
diff
changeset
|
772 |
51195
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
773 pub fn remove(&mut self, rev: Revision) -> Result<(), RevlogError> { |
51264
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
774 let offsets = if self.is_inline() { |
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
775 self.get_offsets().clone() |
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
776 } else { |
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
777 None |
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
778 }; |
51197
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
779 self.bytes.remove(rev, offsets.as_deref())?; |
51264
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
780 if self.is_inline() { |
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
781 if let Some(offsets) = &mut *self.get_offsets_mut() { |
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
782 offsets.truncate(rev.0 as usize) |
47a34afda7ad
rust-index: only access offsets if revlog is inline
Raphaël Gomès <rgomes@octobus.net>
parents:
51261
diff
changeset
|
783 } |
51195
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
784 } |
51234
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
785 self.clear_head_revs(); |
51195
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
786 Ok(()) |
f6403bcd9f96
rust-index: synchronize remove to Rust index
Raphaël Gomès <rgomes@octobus.net>
parents:
51192
diff
changeset
|
787 } |
51197
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
788 |
51234
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
789 pub fn clear_caches(&self) { |
51197
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
790 // 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:
51195
diff
changeset
|
791 // 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:
51195
diff
changeset
|
792 // clear caches. This implies re-populating the offsets on-demand. |
51234
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
793 *self |
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
794 .offsets |
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
795 .write() |
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
796 .expect("RwLock on Index.offsets should not be poisoed") = None; |
59183a19954e
rust-index: use interior mutability in head revs and caches
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51233
diff
changeset
|
797 self.clear_head_revs(); |
51197
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
798 } |
51211
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
799 |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
800 /// Unchecked version of `is_snapshot`. |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
801 /// 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:
51209
diff
changeset
|
802 pub fn is_snapshot_unchecked( |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
803 &self, |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
804 mut rev: Revision, |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
805 ) -> Result<bool, RevlogError> { |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
806 while rev.0 >= 0 { |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
807 let entry = self.get_entry(rev).unwrap(); |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
808 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:
51209
diff
changeset
|
809 if base == rev.0 { |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
810 base = NULL_REVISION.0; |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
811 } |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
812 if base == NULL_REVISION.0 { |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
813 return Ok(true); |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
814 } |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
815 let [mut p1, mut p2] = self |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
816 .parents(rev) |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
817 .map_err(|_| RevlogError::InvalidRevision)?; |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
818 while let Some(p1_entry) = self.get_entry(p1) { |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
819 if p1_entry.compressed_len() != 0 || p1.0 == 0 { |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
820 break; |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
821 } |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
822 let parent_base = |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
823 p1_entry.base_revision_or_base_of_delta_chain(); |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
824 if parent_base.0 == p1.0 { |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
825 break; |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
826 } |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
827 p1 = self |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
828 .check_revision(parent_base) |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
829 .ok_or(RevlogError::InvalidRevision)?; |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
830 } |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
831 while let Some(p2_entry) = self.get_entry(p2) { |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
832 if p2_entry.compressed_len() != 0 || p2.0 == 0 { |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
833 break; |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
834 } |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
835 let parent_base = |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
836 p2_entry.base_revision_or_base_of_delta_chain(); |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
837 if parent_base.0 == p2.0 { |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
838 break; |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
839 } |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
840 p2 = self |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
841 .check_revision(parent_base) |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
842 .ok_or(RevlogError::InvalidRevision)?; |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
843 } |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
844 if base == p1.0 || base == p2.0 { |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
845 return Ok(false); |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
846 } |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
847 rev = self |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
848 .check_revision(base.into()) |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
849 .ok_or(RevlogError::InvalidRevision)?; |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
850 } |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
851 Ok(rev == NULL_REVISION) |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
852 } |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
853 |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
854 /// 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:
51209
diff
changeset
|
855 /// `rev` is not within a valid revision range. |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
856 pub fn is_snapshot( |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
857 &self, |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
858 rev: UncheckedRevision, |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
859 ) -> Result<bool, RevlogError> { |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
860 let rev = self |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
861 .check_revision(rev) |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
862 .ok_or_else(|| RevlogError::corrupted("test"))?; |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
863 self.is_snapshot_unchecked(rev) |
b8c89957a6b7
rust-index: add `is_snapshot` method
Raphaël Gomès <rgomes@octobus.net>
parents:
51209
diff
changeset
|
864 } |
51218
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
865 |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
866 /// Slice revs to reduce the amount of unrelated data to be read from disk. |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
867 /// |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
868 /// The index is sliced into groups that should be read in one time. |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
869 /// |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
870 /// The initial chunk is sliced until the overall density |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
871 /// (payload/chunks-span ratio) is above `target_density`. |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
872 /// No gap smaller than `min_gap_size` is skipped. |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
873 pub fn slice_chunk_to_density( |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
874 &self, |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
875 revs: &[Revision], |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
876 target_density: f64, |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
877 min_gap_size: usize, |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
878 ) -> Vec<Vec<Revision>> { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
879 if revs.is_empty() { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
880 return vec![]; |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
881 } |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
882 if revs.len() == 1 { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
883 return vec![revs.to_owned()]; |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
884 } |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
885 let delta_chain_span = self.segment_span(revs); |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
886 if delta_chain_span < min_gap_size { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
887 return vec![revs.to_owned()]; |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
888 } |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
889 let entries: Vec<_> = revs |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
890 .iter() |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
891 .map(|r| { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
892 (*r, self.get_entry(*r).unwrap_or_else(|| self.null_entry())) |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
893 }) |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
894 .collect(); |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
895 |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
896 let mut read_data = delta_chain_span; |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
897 let chain_payload: u32 = |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
898 entries.iter().map(|(_r, e)| e.compressed_len()).sum(); |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
899 let mut density = if delta_chain_span > 0 { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
900 chain_payload as f64 / delta_chain_span as f64 |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
901 } else { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
902 1.0 |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
903 }; |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
904 |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
905 if density >= target_density { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
906 return vec![revs.to_owned()]; |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
907 } |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
908 |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
909 // Store the gaps in a heap to have them sorted by decreasing size |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
910 let mut gaps = Vec::new(); |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
911 let mut previous_end = None; |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
912 |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
913 for (i, (_rev, entry)) in entries.iter().enumerate() { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
914 let start = entry.c_start() as usize; |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
915 let length = entry.compressed_len(); |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
916 |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
917 // Skip empty revisions to form larger holes |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
918 if length == 0 { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
919 continue; |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
920 } |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
921 |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
922 if let Some(end) = previous_end { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
923 let gap_size = start - end; |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
924 // Only consider holes that are large enough |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
925 if gap_size > min_gap_size { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
926 gaps.push((gap_size, i)); |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
927 } |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
928 } |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
929 previous_end = Some(start + length as usize); |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
930 } |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
931 if gaps.is_empty() { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
932 return vec![revs.to_owned()]; |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
933 } |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
934 // sort the gaps to pop them from largest to small |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
935 gaps.sort_unstable(); |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
936 |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
937 // Collect the indices of the largest holes until |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
938 // the density is acceptable |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
939 let mut selected = vec![]; |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
940 while let Some((gap_size, gap_id)) = gaps.pop() { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
941 if density >= target_density { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
942 break; |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
943 } |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
944 selected.push(gap_id); |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
945 |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
946 // The gap sizes are stored as negatives to be sorted decreasingly |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
947 // by the heap |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
948 read_data -= gap_size; |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
949 density = if read_data > 0 { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
950 chain_payload as f64 / read_data as f64 |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
951 } else { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
952 1.0 |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
953 }; |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
954 if density >= target_density { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
955 break; |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
956 } |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
957 } |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
958 selected.sort_unstable(); |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
959 selected.push(revs.len()); |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
960 |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
961 // Cut the revs at collected indices |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
962 let mut previous_idx = 0; |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
963 let mut chunks = vec![]; |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
964 for idx in selected { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
965 let chunk = self.trim_chunk(&entries, previous_idx, idx); |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
966 if !chunk.is_empty() { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
967 chunks.push(chunk.iter().map(|(rev, _entry)| *rev).collect()); |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
968 } |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
969 previous_idx = idx; |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
970 } |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
971 let chunk = self.trim_chunk(&entries, previous_idx, entries.len()); |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
972 if !chunk.is_empty() { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
973 chunks.push(chunk.iter().map(|(rev, _entry)| *rev).collect()); |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
974 } |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
975 |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
976 chunks |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
977 } |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
978 |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
979 /// Get the byte span of a segment of sorted revisions. |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
980 /// |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
981 /// Occurrences of [`NULL_REVISION`] are ignored at the beginning of |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
982 /// the `revs` segment. |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
983 /// |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
984 /// panics: |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
985 /// - if `revs` is empty or only made of `NULL_REVISION` |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
986 /// - if cannot retrieve entry for the last or first not null element of |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
987 /// `revs`. |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
988 fn segment_span(&self, revs: &[Revision]) -> usize { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
989 if revs.is_empty() { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
990 return 0; |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
991 } |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
992 let last_entry = &self.get_entry(revs[revs.len() - 1]).unwrap(); |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
993 let end = last_entry.c_start() + last_entry.compressed_len() as u64; |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
994 let first_rev = revs.iter().find(|r| r.0 != NULL_REVISION.0).unwrap(); |
51272
c4cbb515b006
rust-clippy: apply some more trivial fixes
Raphaël Gomès <rgomes@octobus.net>
parents:
51264
diff
changeset
|
995 let start = if first_rev.0 == 0 { |
51218
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
996 0 |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
997 } else { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
998 self.get_entry(*first_rev).unwrap().c_start() |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
999 }; |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
1000 (end - start) as usize |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
1001 } |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
1002 |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
1003 /// Returns `&revs[startidx..endidx]` without empty trailing revs |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
1004 fn trim_chunk<'a>( |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
1005 &'a self, |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
1006 revs: &'a [(Revision, IndexEntry)], |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
1007 start: usize, |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
1008 mut end: usize, |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
1009 ) -> &'a [(Revision, IndexEntry)] { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
1010 // Trim empty revs at the end, except the very first rev of a chain |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
1011 let last_rev = revs[end - 1].0; |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
1012 if last_rev.0 < self.len() as BaseRevision { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
1013 while end > 1 |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
1014 && end > start |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
1015 && revs[end - 1].1.compressed_len() == 0 |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
1016 { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
1017 end -= 1 |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
1018 } |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
1019 } |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
1020 &revs[start..end] |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
1021 } |
51220
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1022 |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1023 /// Computes the set of revisions for each non-public phase from `roots`, |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1024 /// which are the last known roots for each non-public phase. |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1025 pub fn compute_phases_map_sets( |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1026 &self, |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1027 roots: HashMap<Phase, Vec<Revision>>, |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1028 ) -> Result<(usize, RootsPerPhase), GraphError> { |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1029 let mut phases = HashMap::new(); |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1030 let mut min_phase_rev = NULL_REVISION; |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1031 |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1032 for phase in Phase::non_public_phases() { |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1033 if let Some(phase_roots) = roots.get(phase) { |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1034 let min_rev = |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1035 self.add_roots_get_min(phase_roots, &mut phases, *phase); |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1036 if min_rev != NULL_REVISION |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1037 && (min_phase_rev == NULL_REVISION |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1038 || min_rev < min_phase_rev) |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1039 { |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1040 min_phase_rev = min_rev; |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1041 } |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1042 } else { |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1043 continue; |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1044 }; |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1045 } |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1046 let mut phase_sets: RootsPerPhase = Default::default(); |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1047 |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1048 if min_phase_rev == NULL_REVISION { |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1049 min_phase_rev = Revision(self.len() as BaseRevision); |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1050 } |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1051 |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1052 for rev in min_phase_rev.0..self.len() as BaseRevision { |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1053 let rev = Revision(rev); |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1054 let [p1, p2] = self.parents(rev)?; |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1055 |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1056 const DEFAULT_PHASE: &Phase = &Phase::Public; |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1057 if p1.0 >= 0 |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1058 && phases.get(&p1).unwrap_or(DEFAULT_PHASE) |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1059 > phases.get(&rev).unwrap_or(DEFAULT_PHASE) |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1060 { |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1061 phases.insert(rev, phases[&p1]); |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1062 } |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1063 if p2.0 >= 0 |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1064 && phases.get(&p2).unwrap_or(DEFAULT_PHASE) |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1065 > phases.get(&rev).unwrap_or(DEFAULT_PHASE) |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1066 { |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1067 phases.insert(rev, phases[&p2]); |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1068 } |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1069 let set = match phases.get(&rev).unwrap_or(DEFAULT_PHASE) { |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1070 Phase::Public => continue, |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1071 phase => &mut phase_sets[*phase as usize - 1], |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1072 }; |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1073 set.insert(rev); |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1074 } |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1075 |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1076 Ok((self.len(), phase_sets)) |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1077 } |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1078 |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1079 fn add_roots_get_min( |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1080 &self, |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1081 phase_roots: &[Revision], |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1082 phases: &mut HashMap<Revision, Phase>, |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1083 phase: Phase, |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1084 ) -> Revision { |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1085 let mut min_rev = NULL_REVISION; |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1086 |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1087 for root in phase_roots { |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1088 phases.insert(*root, phase); |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1089 if min_rev == NULL_REVISION || min_rev > *root { |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1090 min_rev = *root; |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1091 } |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1092 } |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1093 min_rev |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1094 } |
51222
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1095 |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1096 /// Return `(heads(::(<roots> and <roots>::<heads>)))` |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1097 /// If `include_path` is `true`, return `(<roots>::<heads>)`.""" |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1098 /// |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1099 /// `min_root` and `roots` are unchecked since they are just used as |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1100 /// a bound or for comparison and don't need to represent a valid revision. |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1101 /// In practice, the only invalid revision passed is the working directory |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1102 /// revision ([`i32::MAX`]). |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1103 pub fn reachable_roots( |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1104 &self, |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1105 min_root: UncheckedRevision, |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1106 mut heads: Vec<Revision>, |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1107 roots: HashSet<UncheckedRevision>, |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1108 include_path: bool, |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1109 ) -> Result<HashSet<Revision>, GraphError> { |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1110 if roots.is_empty() { |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1111 return Ok(HashSet::new()); |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1112 } |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1113 let mut reachable = HashSet::new(); |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1114 let mut seen = HashMap::new(); |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1115 |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1116 while let Some(rev) = heads.pop() { |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1117 if roots.contains(&rev.into()) { |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1118 reachable.insert(rev); |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1119 if !include_path { |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1120 continue; |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1121 } |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1122 } |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1123 let parents = self.parents(rev)?; |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1124 seen.insert(rev, parents); |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1125 for parent in parents { |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1126 if parent.0 >= min_root.0 && !seen.contains_key(&parent) { |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1127 heads.push(parent); |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1128 } |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1129 } |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1130 } |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1131 if !include_path { |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1132 return Ok(reachable); |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1133 } |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1134 let mut revs: Vec<_> = seen.keys().collect(); |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1135 revs.sort_unstable(); |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1136 for rev in revs { |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1137 for parent in seen[rev] { |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1138 if reachable.contains(&parent) { |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1139 reachable.insert(*rev); |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1140 } |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1141 } |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1142 } |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1143 Ok(reachable) |
fc05dd74e907
rust-index: add support for `reachableroots2`
Raphaël Gomès <rgomes@octobus.net>
parents:
51220
diff
changeset
|
1144 } |
51223
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1145 |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1146 /// Given a (possibly overlapping) set of revs, return all the |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1147 /// common ancestors heads: `heads(::args[0] and ::a[1] and ...)` |
51225
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51224
diff
changeset
|
1148 pub fn common_ancestor_heads( |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51224
diff
changeset
|
1149 &self, |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51224
diff
changeset
|
1150 revisions: &[Revision], |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51224
diff
changeset
|
1151 ) -> Result<Vec<Revision>, GraphError> { |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51224
diff
changeset
|
1152 // given that revisions is expected to be small, we find this shortcut |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51224
diff
changeset
|
1153 // potentially acceptable, especially given that `hg-cpython` could |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51224
diff
changeset
|
1154 // very much bypass this, constructing a vector of unique values from |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51224
diff
changeset
|
1155 // the onset. |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51224
diff
changeset
|
1156 let as_set: HashSet<Revision> = revisions.iter().copied().collect(); |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51224
diff
changeset
|
1157 // Besides deduplicating, the C version also implements the shortcut |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51224
diff
changeset
|
1158 // for `NULL_REVISION`: |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51224
diff
changeset
|
1159 if as_set.contains(&NULL_REVISION) { |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51224
diff
changeset
|
1160 return Ok(vec![]); |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51224
diff
changeset
|
1161 } |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51224
diff
changeset
|
1162 |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51224
diff
changeset
|
1163 let revisions: Vec<Revision> = as_set.into_iter().collect(); |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51224
diff
changeset
|
1164 |
51229
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1165 if revisions.len() < 8 { |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1166 self.find_gca_candidates::<u8>(&revisions) |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1167 } else if revisions.len() < 64 { |
51225
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51224
diff
changeset
|
1168 self.find_gca_candidates::<u64>(&revisions) |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51224
diff
changeset
|
1169 } else { |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51224
diff
changeset
|
1170 self.find_gca_candidates::<NonStaticPoisonableBitSet>(&revisions) |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51224
diff
changeset
|
1171 } |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51224
diff
changeset
|
1172 } |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51224
diff
changeset
|
1173 |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51224
diff
changeset
|
1174 pub fn ancestors( |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51224
diff
changeset
|
1175 &self, |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51224
diff
changeset
|
1176 revisions: &[Revision], |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51224
diff
changeset
|
1177 ) -> Result<Vec<Revision>, GraphError> { |
89ce6a49bfeb
rust-index: implement common_ancestors_heads() and ancestors()
Georges Racinet <georges.racinet@octobus.net>
parents:
51224
diff
changeset
|
1178 self.find_deepest_revs(&self.common_ancestor_heads(revisions)?) |
51223
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1179 } |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1180 |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1181 /// Given a disjoint set of revs, return all candidates for the |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1182 /// greatest common ancestor. In revset notation, this is the set |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1183 /// `heads(::a and ::b and ...)` |
51224
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1184 fn find_gca_candidates<BS: PoisonableBitSet + Clone>( |
51223
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1185 &self, |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1186 revs: &[Revision], |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1187 ) -> Result<Vec<Revision>, GraphError> { |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1188 if revs.is_empty() { |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1189 return Ok(vec![]); |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1190 } |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1191 let revcount = revs.len(); |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1192 let mut candidates = vec![]; |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1193 let max_rev = revs.iter().max().unwrap(); |
51224
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1194 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1195 let mut seen = BS::vec_of_empty(revs.len(), (max_rev.0 + 1) as usize); |
51223
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1196 |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1197 for (idx, rev) in revs.iter().enumerate() { |
51224
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1198 seen[rev.0 as usize].add(idx); |
51223
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1199 } |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1200 let mut current_rev = *max_rev; |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1201 // Number of revisions whose inspection in the main loop |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1202 // will give a result or trigger inspection of other revisions |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1203 let mut interesting = revcount; |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1204 |
51226
83091c14058c
rust-index: avoid some cloning in find_gca_candidates()
Georges Racinet <georges.racinet@octobus.net>
parents:
51225
diff
changeset
|
1205 // The algorithm works on a vector of bit sets, indexed by revision |
83091c14058c
rust-index: avoid some cloning in find_gca_candidates()
Georges Racinet <georges.racinet@octobus.net>
parents:
51225
diff
changeset
|
1206 // numbers and iterated on reverse order. |
83091c14058c
rust-index: avoid some cloning in find_gca_candidates()
Georges Racinet <georges.racinet@octobus.net>
parents:
51225
diff
changeset
|
1207 // An entry in this vector is poisoned if and only if the corresponding |
83091c14058c
rust-index: avoid some cloning in find_gca_candidates()
Georges Racinet <georges.racinet@octobus.net>
parents:
51225
diff
changeset
|
1208 // revision is a common, yet not maximal ancestor. |
51223
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1209 |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1210 // The principle of the algorithm is as follows: |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1211 // For a revision `r`, when entering the loop, `seen[r]` is either |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1212 // poisoned or the sub set of `revs` of which `r` is an ancestor. |
51226
83091c14058c
rust-index: avoid some cloning in find_gca_candidates()
Georges Racinet <georges.racinet@octobus.net>
parents:
51225
diff
changeset
|
1213 // In this sub set is full, then `r` is a solution and its parents |
83091c14058c
rust-index: avoid some cloning in find_gca_candidates()
Georges Racinet <georges.racinet@octobus.net>
parents:
51225
diff
changeset
|
1214 // have to be poisoned. |
51223
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1215 // |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1216 // At each iteration, the bit sets of the parents are updated by |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1217 // union with `seen[r]`. |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1218 // As we walk the index from the end, we are sure we have encountered |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1219 // all children of `r` before `r`, hence we know that `seen[r]` is |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1220 // fully computed. |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1221 // |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1222 // On top of that there are several optimizations that make reading |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1223 // less obvious than the comment above: |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1224 // - The `interesting` counter allows to break early |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1225 // - The loop starts from `max(revs)` |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1226 // - Early return in case it is detected that one of the incoming revs |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1227 // is a common ancestor of all of them. |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1228 while current_rev.0 >= 0 && interesting > 0 { |
51226
83091c14058c
rust-index: avoid some cloning in find_gca_candidates()
Georges Racinet <georges.racinet@octobus.net>
parents:
51225
diff
changeset
|
1229 let current_seen = seen[current_rev.0 as usize].clone(); |
51223
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1230 |
51224
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1231 if current_seen.is_empty() { |
51223
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1232 current_rev = Revision(current_rev.0 - 1); |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1233 continue; |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1234 } |
51226
83091c14058c
rust-index: avoid some cloning in find_gca_candidates()
Georges Racinet <georges.racinet@octobus.net>
parents:
51225
diff
changeset
|
1235 let mut poison = current_seen.is_poisoned(); |
83091c14058c
rust-index: avoid some cloning in find_gca_candidates()
Georges Racinet <georges.racinet@octobus.net>
parents:
51225
diff
changeset
|
1236 if !poison { |
51223
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1237 interesting -= 1; |
51224
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1238 if current_seen.is_full_range(revcount) { |
51223
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1239 candidates.push(current_rev); |
51226
83091c14058c
rust-index: avoid some cloning in find_gca_candidates()
Georges Racinet <georges.racinet@octobus.net>
parents:
51225
diff
changeset
|
1240 poison = true; |
51223
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1241 |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1242 // Being a common ancestor, if `current_rev` is among |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1243 // the input revisions, it is *the* answer. |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1244 for rev in revs { |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1245 if *rev == current_rev { |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1246 return Ok(candidates); |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1247 } |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1248 } |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1249 } |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1250 } |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1251 for parent in self.parents(current_rev)? { |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1252 if parent == NULL_REVISION { |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1253 continue; |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1254 } |
51228
61a6ef876efd
rust-index: simplification in find_gca_candidates()
Georges Racinet <georges.racinet@octobus.net>
parents:
51227
diff
changeset
|
1255 let parent_seen = &mut seen[parent.0 as usize]; |
51227
e553cd209215
rust-index: avoid double negation in find_gca_candidates()
Georges Racinet <georges.racinet@octobus.net>
parents:
51226
diff
changeset
|
1256 if poison { |
e553cd209215
rust-index: avoid double negation in find_gca_candidates()
Georges Racinet <georges.racinet@octobus.net>
parents:
51226
diff
changeset
|
1257 // this block is logically equivalent to poisoning parent |
e553cd209215
rust-index: avoid double negation in find_gca_candidates()
Georges Racinet <georges.racinet@octobus.net>
parents:
51226
diff
changeset
|
1258 // and counting it as non interesting if it |
e553cd209215
rust-index: avoid double negation in find_gca_candidates()
Georges Racinet <georges.racinet@octobus.net>
parents:
51226
diff
changeset
|
1259 // has been seen before (hence counted then as interesting) |
e553cd209215
rust-index: avoid double negation in find_gca_candidates()
Georges Racinet <georges.racinet@octobus.net>
parents:
51226
diff
changeset
|
1260 if !parent_seen.is_empty() && !parent_seen.is_poisoned() { |
e553cd209215
rust-index: avoid double negation in find_gca_candidates()
Georges Racinet <georges.racinet@octobus.net>
parents:
51226
diff
changeset
|
1261 interesting -= 1; |
e553cd209215
rust-index: avoid double negation in find_gca_candidates()
Georges Racinet <georges.racinet@octobus.net>
parents:
51226
diff
changeset
|
1262 } |
51228
61a6ef876efd
rust-index: simplification in find_gca_candidates()
Georges Racinet <georges.racinet@octobus.net>
parents:
51227
diff
changeset
|
1263 parent_seen.poison(); |
51227
e553cd209215
rust-index: avoid double negation in find_gca_candidates()
Georges Racinet <georges.racinet@octobus.net>
parents:
51226
diff
changeset
|
1264 } else { |
51224
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1265 if parent_seen.is_empty() { |
51223
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1266 interesting += 1; |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1267 } |
51228
61a6ef876efd
rust-index: simplification in find_gca_candidates()
Georges Racinet <georges.racinet@octobus.net>
parents:
51227
diff
changeset
|
1268 parent_seen.union(¤t_seen); |
51223
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1269 } |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1270 } |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1271 |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1272 current_rev = Revision(current_rev.0 - 1); |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1273 } |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1274 |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1275 Ok(candidates) |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1276 } |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1277 |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1278 /// Given a disjoint set of revs, return the subset with the longest path |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1279 /// to the root. |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1280 fn find_deepest_revs( |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1281 &self, |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1282 revs: &[Revision], |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1283 ) -> Result<Vec<Revision>, GraphError> { |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1284 // TODO replace this all with just comparing rank? |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1285 // Also, the original implementations in C/Python are cryptic, not |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1286 // even sure we actually need this? |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1287 if revs.len() <= 1 { |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1288 return Ok(revs.to_owned()); |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1289 } |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1290 let max_rev = revs.iter().max().unwrap().0; |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1291 let mut interesting = HashMap::new(); |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1292 let mut seen = vec![0; max_rev as usize + 1]; |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1293 let mut depth = vec![0; max_rev as usize + 1]; |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1294 let mut mapping = vec![]; |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1295 let mut revs = revs.to_owned(); |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1296 revs.sort_unstable(); |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1297 |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1298 for (idx, rev) in revs.iter().enumerate() { |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1299 depth[rev.0 as usize] = 1; |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1300 let shift = 1 << idx; |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1301 seen[rev.0 as usize] = shift; |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1302 interesting.insert(shift, 1); |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1303 mapping.push((shift, *rev)); |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1304 } |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1305 |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1306 let mut current_rev = Revision(max_rev); |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1307 while current_rev.0 >= 0 && interesting.len() > 1 { |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1308 let current_depth = depth[current_rev.0 as usize]; |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1309 if current_depth == 0 { |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1310 current_rev = Revision(current_rev.0 - 1); |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1311 continue; |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1312 } |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1313 |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1314 let current_seen = seen[current_rev.0 as usize]; |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1315 for parent in self.parents(current_rev)? { |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1316 if parent == NULL_REVISION { |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1317 continue; |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1318 } |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1319 let parent_seen = seen[parent.0 as usize]; |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1320 let parent_depth = depth[parent.0 as usize]; |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1321 if parent_depth <= current_depth { |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1322 depth[parent.0 as usize] = current_depth + 1; |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1323 if parent_seen != current_seen { |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1324 *interesting.get_mut(¤t_seen).unwrap() += 1; |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1325 seen[parent.0 as usize] = current_seen; |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1326 if parent_seen != 0 { |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1327 let parent_interesting = |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1328 interesting.get_mut(&parent_seen).unwrap(); |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1329 *parent_interesting -= 1; |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1330 if *parent_interesting == 0 { |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1331 interesting.remove(&parent_seen); |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1332 } |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1333 } |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1334 } |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1335 } else if current_depth == parent_depth - 1 { |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1336 let either_seen = parent_seen | current_seen; |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1337 if either_seen == parent_seen { |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1338 continue; |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1339 } |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1340 seen[parent.0 as usize] = either_seen; |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1341 interesting |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1342 .entry(either_seen) |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1343 .and_modify(|v| *v += 1) |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1344 .or_insert(1); |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1345 *interesting.get_mut(&parent_seen).unwrap() -= 1; |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1346 if interesting[&parent_seen] == 0 { |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1347 interesting.remove(&parent_seen); |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1348 } |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1349 } |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1350 } |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1351 *interesting.get_mut(¤t_seen).unwrap() -= 1; |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1352 if interesting[¤t_seen] == 0 { |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1353 interesting.remove(¤t_seen); |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1354 } |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1355 |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1356 current_rev = Revision(current_rev.0 - 1); |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1357 } |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1358 |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1359 if interesting.len() != 1 { |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1360 return Ok(vec![]); |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1361 } |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1362 let mask = interesting.keys().next().unwrap(); |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1363 |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1364 Ok(mapping |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1365 .into_iter() |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1366 .filter_map(|(shift, rev)| { |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1367 if (mask & shift) != 0 { |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1368 return Some(rev); |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1369 } |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1370 None |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1371 }) |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1372 .collect()) |
42c8dbdb88ad
rust-index: core impl for find_gca_candidates and find_deepest
Raphaël Gomès <rgomes@octobus.net>
parents:
51222
diff
changeset
|
1373 } |
51197
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
1374 } |
51220
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1375 |
51224
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1376 /// The kind of functionality needed by find_gca_candidates |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1377 /// |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1378 /// This is a bit mask which can be declared to be "poisoned", which callers |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1379 /// interpret to break out of some loops. |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1380 /// |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1381 /// The maximum capacity of the bit mask is up to the actual implementation |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1382 trait PoisonableBitSet: Sized + PartialEq { |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1383 /// Return a vector of exactly n elements, initialized to be empty. |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1384 /// |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1385 /// Optimization can vastly depend on implementation. Those being `Copy` |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1386 /// and having constant capacity typically can have a very simple |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1387 /// implementation. |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1388 fn vec_of_empty(sets_size: usize, vec_len: usize) -> Vec<Self>; |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1389 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1390 /// The size of the bit mask in memory |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1391 fn size(&self) -> usize; |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1392 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1393 /// The number of elements that can be represented in the set. |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1394 /// |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1395 /// Another way to put it is that it is the highest integer `C` such that |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1396 /// the set is guaranteed to always be a subset of the integer range |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1397 /// `[0, C)` |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1398 fn capacity(&self) -> usize; |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1399 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1400 /// Declare `n` to belong to the set |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1401 fn add(&mut self, n: usize); |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1402 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1403 /// Declare `n` not to belong to the set |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1404 fn discard(&mut self, n: usize); |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1405 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1406 /// Replace this bit set by its union with other |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1407 fn union(&mut self, other: &Self); |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1408 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1409 /// Poison the bit set |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1410 /// |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1411 /// Interpretation up to the caller |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1412 fn poison(&mut self); |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1413 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1414 /// Is the bit set poisoned? |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1415 /// |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1416 /// Interpretation is up to the caller |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1417 fn is_poisoned(&self) -> bool; |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1418 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1419 /// Is the bit set empty? |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1420 fn is_empty(&self) -> bool; |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1421 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1422 /// return `true` if and only if the bit is the full range `[0, n)` |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1423 /// of integers |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1424 fn is_full_range(&self, n: usize) -> bool; |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1425 } |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1426 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1427 const U64_POISON: u64 = 1 << 63; |
51229
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1428 const U8_POISON: u8 = 1 << 7; |
51224
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1429 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1430 impl PoisonableBitSet for u64 { |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1431 fn vec_of_empty(_sets_size: usize, vec_len: usize) -> Vec<Self> { |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1432 vec![0u64; vec_len] |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1433 } |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1434 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1435 fn size(&self) -> usize { |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1436 8 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1437 } |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1438 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1439 fn capacity(&self) -> usize { |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1440 63 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1441 } |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1442 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1443 fn add(&mut self, n: usize) { |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1444 (*self) |= 1u64 << n; |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1445 } |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1446 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1447 fn discard(&mut self, n: usize) { |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1448 (*self) &= u64::MAX - (1u64 << n); |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1449 } |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1450 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1451 fn union(&mut self, other: &Self) { |
51228
61a6ef876efd
rust-index: simplification in find_gca_candidates()
Georges Racinet <georges.racinet@octobus.net>
parents:
51227
diff
changeset
|
1452 if *self != *other { |
61a6ef876efd
rust-index: simplification in find_gca_candidates()
Georges Racinet <georges.racinet@octobus.net>
parents:
51227
diff
changeset
|
1453 (*self) |= *other; |
61a6ef876efd
rust-index: simplification in find_gca_candidates()
Georges Racinet <georges.racinet@octobus.net>
parents:
51227
diff
changeset
|
1454 } |
51224
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1455 } |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1456 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1457 fn is_full_range(&self, n: usize) -> bool { |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1458 *self + 1 == (1u64 << n) |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1459 } |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1460 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1461 fn is_empty(&self) -> bool { |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1462 *self == 0 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1463 } |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1464 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1465 fn poison(&mut self) { |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1466 *self = U64_POISON; |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1467 } |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1468 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1469 fn is_poisoned(&self) -> bool { |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1470 // equality comparison would be tempting but would not resist |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1471 // operations after poisoning (even if these should be bogus). |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1472 *self >= U64_POISON |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1473 } |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1474 } |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1475 |
51229
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1476 impl PoisonableBitSet for u8 { |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1477 fn vec_of_empty(_sets_size: usize, vec_len: usize) -> Vec<Self> { |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1478 vec![0; vec_len] |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1479 } |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1480 |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1481 fn size(&self) -> usize { |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1482 1 |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1483 } |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1484 |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1485 fn capacity(&self) -> usize { |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1486 7 |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1487 } |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1488 |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1489 fn add(&mut self, n: usize) { |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1490 (*self) |= 1 << n; |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1491 } |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1492 |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1493 fn discard(&mut self, n: usize) { |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1494 (*self) &= u8::MAX - (1 << n); |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1495 } |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1496 |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1497 fn union(&mut self, other: &Self) { |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1498 if *self != *other { |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1499 (*self) |= *other; |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1500 } |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1501 } |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1502 |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1503 fn is_full_range(&self, n: usize) -> bool { |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1504 *self + 1 == (1 << n) |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1505 } |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1506 |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1507 fn is_empty(&self) -> bool { |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1508 *self == 0 |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1509 } |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1510 |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1511 fn poison(&mut self) { |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1512 *self = U8_POISON; |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1513 } |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1514 |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1515 fn is_poisoned(&self) -> bool { |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1516 // equality comparison would be tempting but would not resist |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1517 // operations after poisoning (even if these should be bogus). |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1518 *self >= U8_POISON |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1519 } |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1520 } |
1b23aaf5eb7b
rust-index: optimize find_gca_candidates() on less than 8 revisions
Georges Racinet <georges.racinet@octobus.net>
parents:
51228
diff
changeset
|
1521 |
51224
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1522 /// A poisonable bit set whose capacity is not known at compile time but |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1523 /// is constant after initial construction |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1524 /// |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1525 /// This can be way further optimized if performance assessments (speed |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1526 /// and/or RAM) require it. |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1527 /// As far as RAM is concerned, for large vectors of these, the main problem |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1528 /// would be the repetition of set_size in each item. We would need a trait |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1529 /// to abstract over the idea of a vector of such bit sets to do better. |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1530 #[derive(Clone, PartialEq)] |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1531 struct NonStaticPoisonableBitSet { |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1532 set_size: usize, |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1533 bit_set: Vec<u64>, |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1534 } |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1535 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1536 /// Number of `u64` needed for a [`NonStaticPoisonableBitSet`] of given size |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1537 fn non_static_poisonable_inner_len(set_size: usize) -> usize { |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1538 1 + (set_size + 1) / 64 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1539 } |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1540 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1541 impl NonStaticPoisonableBitSet { |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1542 /// The index of the sub-bit set for the given n, and the index inside |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1543 /// the latter |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1544 fn index(&self, n: usize) -> (usize, usize) { |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1545 (n / 64, n % 64) |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1546 } |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1547 } |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1548 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1549 /// Mock implementation to ensure that the trait makes sense |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1550 impl PoisonableBitSet for NonStaticPoisonableBitSet { |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1551 fn vec_of_empty(set_size: usize, vec_len: usize) -> Vec<Self> { |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1552 let tmpl = Self { |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1553 set_size, |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1554 bit_set: vec![0u64; non_static_poisonable_inner_len(set_size)], |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1555 }; |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1556 vec![tmpl; vec_len] |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1557 } |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1558 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1559 fn size(&self) -> usize { |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1560 8 + self.bit_set.len() * 8 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1561 } |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1562 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1563 fn capacity(&self) -> usize { |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1564 self.set_size |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1565 } |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1566 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1567 fn add(&mut self, n: usize) { |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1568 let (sub_bs, bit_pos) = self.index(n); |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1569 self.bit_set[sub_bs] |= 1 << bit_pos |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1570 } |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1571 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1572 fn discard(&mut self, n: usize) { |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1573 let (sub_bs, bit_pos) = self.index(n); |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1574 self.bit_set[sub_bs] |= u64::MAX - (1 << bit_pos) |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1575 } |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1576 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1577 fn union(&mut self, other: &Self) { |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1578 assert!( |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1579 self.set_size == other.set_size, |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1580 "Binary operations on bit sets can only be done on same size" |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1581 ); |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1582 for i in 0..self.bit_set.len() - 1 { |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1583 self.bit_set[i] |= other.bit_set[i] |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1584 } |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1585 } |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1586 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1587 fn is_full_range(&self, n: usize) -> bool { |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1588 let (sub_bs, bit_pos) = self.index(n); |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1589 self.bit_set[..sub_bs].iter().all(|bs| *bs == u64::MAX) |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1590 && self.bit_set[sub_bs] == (1 << (bit_pos + 1)) - 1 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1591 } |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1592 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1593 fn is_empty(&self) -> bool { |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1594 self.bit_set.iter().all(|bs| *bs == 0u64) |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1595 } |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1596 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1597 fn poison(&mut self) { |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1598 let (sub_bs, bit_pos) = self.index(self.set_size); |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1599 self.bit_set[sub_bs] = 1 << bit_pos; |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1600 } |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1601 |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1602 fn is_poisoned(&self) -> bool { |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1603 let (sub_bs, bit_pos) = self.index(self.set_size); |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1604 self.bit_set[sub_bs] >= 1 << bit_pos |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1605 } |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1606 } |
43241f31cf5b
rust-index: find_gca_candidates bit sets genericization
Georges Racinet on incendie.racinet.fr <georges@racinet.fr>
parents:
51223
diff
changeset
|
1607 |
51220
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1608 /// Set of roots of all non-public phases |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1609 pub type RootsPerPhase = [HashSet<Revision>; Phase::non_public_phases().len()]; |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1610 |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1611 #[derive(Debug, Copy, Clone, PartialEq, Eq, Ord, PartialOrd, Hash)] |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1612 pub enum Phase { |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1613 Public = 0, |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1614 Draft = 1, |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1615 Secret = 2, |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1616 Archived = 3, |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1617 Internal = 4, |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1618 } |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1619 |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1620 impl TryFrom<usize> for Phase { |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1621 type Error = RevlogError; |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1622 |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1623 fn try_from(value: usize) -> Result<Self, Self::Error> { |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1624 Ok(match value { |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1625 0 => Self::Public, |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1626 1 => Self::Draft, |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1627 2 => Self::Secret, |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1628 32 => Self::Archived, |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1629 96 => Self::Internal, |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1630 v => { |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1631 return Err(RevlogError::corrupted(format!( |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1632 "invalid phase value {}", |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1633 v |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1634 ))) |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1635 } |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1636 }) |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1637 } |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1638 } |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1639 |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1640 impl Phase { |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1641 pub const fn all_phases() -> &'static [Self] { |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1642 &[ |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1643 Self::Public, |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1644 Self::Draft, |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1645 Self::Secret, |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1646 Self::Archived, |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1647 Self::Internal, |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1648 ] |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1649 } |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1650 pub const fn non_public_phases() -> &'static [Self] { |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1651 &[Self::Draft, Self::Secret, Self::Archived, Self::Internal] |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1652 } |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1653 } |
c817d9f626d3
rust-index: add support for `computephasesmapsets`
Raphaël Gomès <rgomes@octobus.net>
parents:
51218
diff
changeset
|
1654 |
51197
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
1655 fn inline_scan(bytes: &[u8]) -> (usize, Vec<usize>) { |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
1656 let mut offset: usize = 0; |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
1657 let mut offsets = Vec::new(); |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
1658 |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
1659 while offset + INDEX_ENTRY_SIZE <= bytes.len() { |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
1660 offsets.push(offset); |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
1661 let end = offset + INDEX_ENTRY_SIZE; |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
1662 let entry = IndexEntry { |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
1663 bytes: &bytes[offset..end], |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
1664 offset_override: None, |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
1665 }; |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
1666 |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
1667 offset += INDEX_ENTRY_SIZE + entry.compressed_len() as usize; |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
1668 } |
4e6620b7fbbb
rust-index: support cache clearing
Raphaël Gomès <rgomes@octobus.net>
parents:
51195
diff
changeset
|
1669 (offset, offsets) |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1670 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1671 |
46090
9eb07ab3f2d4
rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents:
46033
diff
changeset
|
1672 impl super::RevlogIndex for Index { |
9eb07ab3f2d4
rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents:
46033
diff
changeset
|
1673 fn len(&self) -> usize { |
9eb07ab3f2d4
rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents:
46033
diff
changeset
|
1674 self.len() |
9eb07ab3f2d4
rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents:
46033
diff
changeset
|
1675 } |
9eb07ab3f2d4
rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents:
46033
diff
changeset
|
1676 |
9eb07ab3f2d4
rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents:
46033
diff
changeset
|
1677 fn node(&self, rev: Revision) -> Option<&Node> { |
51209
e9d47e2f5dcf
rust-index: add missing special case for null rev
Raphaël Gomès <rgomes@octobus.net>
parents:
51205
diff
changeset
|
1678 if rev == NULL_REVISION { |
e9d47e2f5dcf
rust-index: add missing special case for null rev
Raphaël Gomès <rgomes@octobus.net>
parents:
51205
diff
changeset
|
1679 return Some(&NULL_NODE); |
e9d47e2f5dcf
rust-index: add missing special case for null rev
Raphaël Gomès <rgomes@octobus.net>
parents:
51205
diff
changeset
|
1680 } |
46090
9eb07ab3f2d4
rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents:
46033
diff
changeset
|
1681 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
|
1682 } |
9eb07ab3f2d4
rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents:
46033
diff
changeset
|
1683 } |
9eb07ab3f2d4
rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents:
46033
diff
changeset
|
1684 |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1685 #[derive(Debug)] |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1686 pub struct IndexEntry<'a> { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1687 bytes: &'a [u8], |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1688 /// 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
|
1689 /// |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1690 /// 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
|
1691 /// 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
|
1692 /// 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
|
1693 /// 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
|
1694 /// |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1695 /// 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
|
1696 /// 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
|
1697 /// 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
|
1698 offset_override: Option<usize>, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1699 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1700 |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1701 impl<'a> IndexEntry<'a> { |
45593
da30e4b553c3
hg-core: minor docstring update (D8958#inline-14991 followup)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45592
diff
changeset
|
1702 /// 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
|
1703 pub fn offset(&self) -> usize { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1704 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
|
1705 offset_override |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1706 } else { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1707 let mut bytes = [0; 8]; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1708 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
|
1709 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
|
1710 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1711 } |
51205
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
1712 pub fn raw_offset(&self) -> u64 { |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
1713 BigEndian::read_u64(&self.bytes[0..8]) |
002b49905aac
rust-index: implementation of __getitem__
Raphaël Gomès <rgomes@octobus.net>
parents:
51203
diff
changeset
|
1714 } |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1715 |
51218
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
1716 /// Same result (except potentially for rev 0) as C `index_get_start()` |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
1717 fn c_start(&self) -> u64 { |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
1718 self.raw_offset() >> 16 |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
1719 } |
0112803e6c01
rust-index: add support for `_slicechunktodensity`
Raphaël Gomès <rgomes@octobus.net>
parents:
51216
diff
changeset
|
1720 |
48546
e91aa800ae5b
rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents:
48543
diff
changeset
|
1721 pub fn flags(&self) -> u16 { |
e91aa800ae5b
rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents:
48543
diff
changeset
|
1722 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
|
1723 } |
e91aa800ae5b
rhg: desambiguate status without decompressing filelog if possible
Simon Sapin <simon.sapin@octobus.net>
parents:
48543
diff
changeset
|
1724 |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1725 /// 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
|
1726 pub fn compressed_len(&self) -> u32 { |
0a4ac916673e
rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents:
48458
diff
changeset
|
1727 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
|
1728 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1729 |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1730 /// 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
|
1731 pub fn uncompressed_len(&self) -> i32 { |
0a4ac916673e
rhg: RevlogEntry::uncompressed_len is signed
Simon Sapin <simon.sapin@octobus.net>
parents:
48458
diff
changeset
|
1732 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
|
1733 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1734 |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1735 /// Return the revision upon which the data has been derived. |
50977
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49930
diff
changeset
|
1736 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
|
1737 // 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
|
1738 // 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
|
1739 |
50977
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49930
diff
changeset
|
1740 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
|
1741 } |
45531
b0d6309ff50c
hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45526
diff
changeset
|
1742 |
50977
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49930
diff
changeset
|
1743 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
|
1744 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
|
1745 } |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
1746 |
50977
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49930
diff
changeset
|
1747 pub fn p1(&self) -> UncheckedRevision { |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49930
diff
changeset
|
1748 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
|
1749 } |
b0d6309ff50c
hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45526
diff
changeset
|
1750 |
50977
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49930
diff
changeset
|
1751 pub fn p2(&self) -> UncheckedRevision { |
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49930
diff
changeset
|
1752 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
|
1753 } |
b0d6309ff50c
hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45526
diff
changeset
|
1754 |
b0d6309ff50c
hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45526
diff
changeset
|
1755 /// 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
|
1756 /// |
b0d6309ff50c
hg-core: check data integrity in `Revlog`
Antoine Cezar <antoine.cezar@octobus.net>
parents:
45526
diff
changeset
|
1757 /// 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
|
1758 /// are used. |
46090
9eb07ab3f2d4
rhg: use persistent nodemap when available
Simon Sapin <simon-commits@exyr.org>
parents:
46033
diff
changeset
|
1759 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
|
1760 (&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
|
1761 } |
51203
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51198
diff
changeset
|
1762 |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51198
diff
changeset
|
1763 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:
51198
diff
changeset
|
1764 self.bytes |
7434747343ab
rust-index: check that the entry bytes are the same in both indexes
Raphaël Gomès <rgomes@octobus.net>
parents:
51198
diff
changeset
|
1765 } |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1766 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1767 |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1768 #[cfg(test)] |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1769 mod tests { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1770 use super::*; |
49093
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
1771 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
|
1772 |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1773 #[cfg(test)] |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1774 #[derive(Debug, Copy, Clone)] |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1775 pub struct IndexEntryBuilder { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1776 is_first: bool, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1777 is_inline: bool, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1778 is_general_delta: bool, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1779 version: u16, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1780 offset: usize, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1781 compressed_len: usize, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1782 uncompressed_len: usize, |
48458
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48457
diff
changeset
|
1783 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
|
1784 link_revision: Revision, |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
1785 p1: Revision, |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
1786 p2: Revision, |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
1787 node: Node, |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1788 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1789 |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1790 #[cfg(test)] |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1791 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
|
1792 #[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
|
1793 pub fn new() -> Self { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1794 Self { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1795 is_first: false, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1796 is_inline: false, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1797 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
|
1798 version: 1, |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1799 offset: 0, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1800 compressed_len: 0, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1801 uncompressed_len: 0, |
50979
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50978
diff
changeset
|
1802 base_revision_or_base_of_delta_chain: Revision(0), |
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50978
diff
changeset
|
1803 link_revision: Revision(0), |
49093
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
1804 p1: NULL_REVISION, |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
1805 p2: NULL_REVISION, |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
1806 node: NULL_NODE, |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1807 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1808 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1809 |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1810 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
|
1811 self.is_first = value; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1812 self |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1813 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1814 |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1815 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
|
1816 self.is_inline = value; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1817 self |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1818 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1819 |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1820 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
|
1821 self.is_general_delta = value; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1822 self |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1823 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1824 |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1825 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
|
1826 self.version = value; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1827 self |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1828 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1829 |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1830 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
|
1831 self.offset = value; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1832 self |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1833 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1834 |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1835 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
|
1836 self.compressed_len = value; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1837 self |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1838 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1839 |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1840 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
|
1841 self.uncompressed_len = value; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1842 self |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1843 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1844 |
48458
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48457
diff
changeset
|
1845 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
|
1846 &mut self, |
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48457
diff
changeset
|
1847 value: Revision, |
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48457
diff
changeset
|
1848 ) -> &mut Self { |
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48457
diff
changeset
|
1849 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
|
1850 self |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1851 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1852 |
49093
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
1853 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
|
1854 self.link_revision = value; |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
1855 self |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
1856 } |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
1857 |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
1858 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
|
1859 self.p1 = value; |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
1860 self |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
1861 } |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
1862 |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
1863 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
|
1864 self.p2 = value; |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
1865 self |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
1866 } |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
1867 |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
1868 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
|
1869 self.node = value; |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
1870 self |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
1871 } |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
1872 |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1873 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
|
1874 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
|
1875 if self.is_first { |
51272
c4cbb515b006
rust-clippy: apply some more trivial fixes
Raphaël Gomès <rgomes@octobus.net>
parents:
51264
diff
changeset
|
1876 bytes.extend(match (self.is_general_delta, self.is_inline) { |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1877 (false, false) => [0u8, 0], |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1878 (false, true) => [0u8, 1], |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1879 (true, false) => [0u8, 2], |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1880 (true, true) => [0u8, 3], |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1881 }); |
51272
c4cbb515b006
rust-clippy: apply some more trivial fixes
Raphaël Gomès <rgomes@octobus.net>
parents:
51264
diff
changeset
|
1882 bytes.extend(self.version.to_be_bytes()); |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1883 // Remaining offset bytes. |
51272
c4cbb515b006
rust-clippy: apply some more trivial fixes
Raphaël Gomès <rgomes@octobus.net>
parents:
51264
diff
changeset
|
1884 bytes.extend([0u8; 2]); |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1885 } else { |
46887
6d5a26e94d9e
unit-tests: Fix `cargo test` on 32-bit platforms
Simon Sapin <simon.sapin@octobus.net>
parents:
46443
diff
changeset
|
1886 // 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
|
1887 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
|
1888 } |
51272
c4cbb515b006
rust-clippy: apply some more trivial fixes
Raphaël Gomès <rgomes@octobus.net>
parents:
51264
diff
changeset
|
1889 bytes.extend([0u8; 2]); // Revision flags. |
c4cbb515b006
rust-clippy: apply some more trivial fixes
Raphaël Gomès <rgomes@octobus.net>
parents:
51264
diff
changeset
|
1890 bytes.extend((self.compressed_len as u32).to_be_bytes()); |
c4cbb515b006
rust-clippy: apply some more trivial fixes
Raphaël Gomès <rgomes@octobus.net>
parents:
51264
diff
changeset
|
1891 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
|
1892 bytes.extend( |
51272
c4cbb515b006
rust-clippy: apply some more trivial fixes
Raphaël Gomès <rgomes@octobus.net>
parents:
51264
diff
changeset
|
1893 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
|
1894 ); |
51272
c4cbb515b006
rust-clippy: apply some more trivial fixes
Raphaël Gomès <rgomes@octobus.net>
parents:
51264
diff
changeset
|
1895 bytes.extend(self.link_revision.0.to_be_bytes()); |
c4cbb515b006
rust-clippy: apply some more trivial fixes
Raphaël Gomès <rgomes@octobus.net>
parents:
51264
diff
changeset
|
1896 bytes.extend(self.p1.0.to_be_bytes()); |
c4cbb515b006
rust-clippy: apply some more trivial fixes
Raphaël Gomès <rgomes@octobus.net>
parents:
51264
diff
changeset
|
1897 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
|
1898 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
|
1899 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
|
1900 bytes |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1901 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1902 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1903 |
48457
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
1904 pub fn is_inline(index_bytes: &[u8]) -> bool { |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
1905 IndexHeader::parse(index_bytes) |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
1906 .expect("too short") |
51191
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents:
51189
diff
changeset
|
1907 .unwrap() |
48457
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
1908 .format_flags() |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
1909 .is_inline() |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
1910 } |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
1911 |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
1912 pub fn uses_generaldelta(index_bytes: &[u8]) -> bool { |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
1913 IndexHeader::parse(index_bytes) |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
1914 .expect("too short") |
51191
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents:
51189
diff
changeset
|
1915 .unwrap() |
48457
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
1916 .format_flags() |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
1917 .uses_generaldelta() |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
1918 } |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
1919 |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
1920 pub fn get_version(index_bytes: &[u8]) -> u16 { |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
1921 IndexHeader::parse(index_bytes) |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
1922 .expect("too short") |
51191
13f58ce70299
rust-revlog: teach the revlog opening code to read the repo options
Raphaël Gomès <rgomes@octobus.net>
parents:
51189
diff
changeset
|
1923 .unwrap() |
48457
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
1924 .format_version() |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
1925 } |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
1926 |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1927 #[test] |
48457
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
1928 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
|
1929 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
|
1930 .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
|
1931 .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
|
1932 .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
|
1933 .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
|
1934 |
49930
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents:
49926
diff
changeset
|
1935 assert!(!is_inline(&bytes)); |
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents:
49926
diff
changeset
|
1936 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
|
1937 } |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45593
diff
changeset
|
1938 |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45593
diff
changeset
|
1939 #[test] |
48457
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
1940 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
|
1941 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
|
1942 .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
|
1943 .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
|
1944 .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
|
1945 .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
|
1946 |
49930
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents:
49926
diff
changeset
|
1947 assert!(is_inline(&bytes)); |
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents:
49926
diff
changeset
|
1948 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
|
1949 } |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45593
diff
changeset
|
1950 |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45593
diff
changeset
|
1951 #[test] |
48457
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
1952 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
|
1953 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
|
1954 .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
|
1955 .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
|
1956 .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
|
1957 .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
|
1958 |
49930
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents:
49926
diff
changeset
|
1959 assert!(is_inline(&bytes)); |
e98fd81bb151
rust-clippy: fix most warnings in `hg-core`
Raphaël Gomès <rgomes@octobus.net>
parents:
49926
diff
changeset
|
1960 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
|
1961 } |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45593
diff
changeset
|
1962 |
900b9b79b99c
hg-core: make `Index` owner of its bytes (D8958#inline-14994 followup 1/2)
Antoine cezar<acezar@chwitlabs.fr>
parents:
45593
diff
changeset
|
1963 #[test] |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1964 fn test_offset() { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1965 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
|
1966 let entry = IndexEntry { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1967 bytes: &bytes, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1968 offset_override: None, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1969 }; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1970 |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1971 assert_eq!(entry.offset(), 1) |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1972 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1973 |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1974 #[test] |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1975 fn test_with_overridden_offset() { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1976 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
|
1977 let entry = IndexEntry { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1978 bytes: &bytes, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1979 offset_override: Some(2), |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1980 }; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1981 |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1982 assert_eq!(entry.offset(), 2) |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1983 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1984 |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1985 #[test] |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1986 fn test_compressed_len() { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1987 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
|
1988 let entry = IndexEntry { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1989 bytes: &bytes, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1990 offset_override: None, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1991 }; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1992 |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1993 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
|
1994 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1995 |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1996 #[test] |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1997 fn test_uncompressed_len() { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
1998 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
|
1999 let entry = IndexEntry { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
2000 bytes: &bytes, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
2001 offset_override: None, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
2002 }; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
2003 |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
2004 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
|
2005 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
2006 |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
2007 #[test] |
48458
96ea4db4741b
rhg: fix a crash on non-generaldelta revlogs
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48457
diff
changeset
|
2008 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
|
2009 let bytes = IndexEntryBuilder::new() |
50979
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50978
diff
changeset
|
2010 .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
|
2011 .build(); |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
2012 let entry = IndexEntry { |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
2013 bytes: &bytes, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
2014 offset_override: None, |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
2015 }; |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
2016 |
50977
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49930
diff
changeset
|
2017 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
|
2018 } |
48457
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
2019 |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
2020 #[test] |
49093
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2021 fn link_revision_test() { |
50979
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50978
diff
changeset
|
2022 let bytes = IndexEntryBuilder::new() |
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50978
diff
changeset
|
2023 .with_link_revision(Revision(123)) |
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50978
diff
changeset
|
2024 .build(); |
49093
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2025 |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2026 let entry = IndexEntry { |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2027 bytes: &bytes, |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2028 offset_override: None, |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2029 }; |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2030 |
50977
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49930
diff
changeset
|
2031 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
|
2032 } |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2033 |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2034 #[test] |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2035 fn p1_test() { |
50979
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50978
diff
changeset
|
2036 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
|
2037 |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2038 let entry = IndexEntry { |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2039 bytes: &bytes, |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2040 offset_override: None, |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2041 }; |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2042 |
50977
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49930
diff
changeset
|
2043 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
|
2044 } |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2045 |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2046 #[test] |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2047 fn p2_test() { |
50979
4c5f6e95df84
rust: make `Revision` a newtype
Raphaël Gomès <rgomes@octobus.net>
parents:
50978
diff
changeset
|
2048 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
|
2049 |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2050 let entry = IndexEntry { |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2051 bytes: &bytes, |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2052 offset_override: None, |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2053 }; |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2054 |
50977
1928b770e3e7
rust: use the new `UncheckedRevision` everywhere applicable
Raphaël Gomès <rgomes@octobus.net>
parents:
49930
diff
changeset
|
2055 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
|
2056 } |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2057 |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2058 #[test] |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2059 fn node_test() { |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2060 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
|
2061 .unwrap(); |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2062 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
|
2063 |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2064 let entry = IndexEntry { |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2065 bytes: &bytes, |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2066 offset_override: None, |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2067 }; |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2068 |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2069 assert_eq!(*entry.hash(), node); |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2070 } |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2071 |
2a9a55ffe24f
rust-revlog: make `IndexEntryBuilder` build a whole entry
Martin von Zweigbergk <martinvonz@google.com>
parents:
49092
diff
changeset
|
2072 #[test] |
48457
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
2073 fn version_test() { |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
2074 let bytes = IndexEntryBuilder::new() |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
2075 .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
|
2076 .with_version(2) |
48457
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
2077 .build(); |
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
2078 |
49092
d200ecb76c72
rust-revlog: change default version from 2 to 1 in test builder
Martin von Zweigbergk <martinvonz@google.com>
parents:
48546
diff
changeset
|
2079 assert_eq!(get_version(&bytes), 2) |
48457
1fb3615dfce2
rhg: centralize index header parsing
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
48226
diff
changeset
|
2080 } |
45526
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
2081 } |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
2082 |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
2083 #[cfg(test)] |
26c53ee51c68
hg-core: Add a limited read only `revlog` implementation
Antoine Cezar <antoine.cezar@octobus.net>
parents:
diff
changeset
|
2084 pub use tests::IndexEntryBuilder; |