author | Georges Racinet <georges.racinet@cloudcrane.io> |
Sun, 22 Dec 2024 17:02:09 +0100 | |
changeset 52792 | acae91fad6be |
parent 52791 | 0ac956db7ea7 |
child 52835 | bc095c0db77c |
permissions | -rw-r--r-- |
52789
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
1 |
// revlog/index.rs |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
2 |
// |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
3 |
// Copyright 2019-2020 Georges Racinet <georges.racinet@octobus.net> |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
4 |
// 2020-2024 Raphaël Gomès <raphael.gomes@octobus.net> |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
5 |
// 2024 Georges Racinet <georges.racinet@cloudcrane.io> |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
6 |
// |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
7 |
// This software may be used and distributed according to the terms of the |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
8 |
// GNU General Public License version 2 or any later version. |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
9 |
//! Utilities for dealing with the index at the Python boundary |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
10 |
use pyo3::prelude::*; |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
11 |
use pyo3::types::{PyBytes, PyTuple}; |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
12 |
|
52792
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
13 |
use hg::revlog::{ |
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
14 |
index::{Index, RevisionDataParams}, |
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
15 |
Node, Revision, RevlogIndex, |
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
16 |
}; |
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
17 |
|
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
18 |
#[derive(derive_more::From)] |
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
19 |
pub struct PySharedIndex { |
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
20 |
/// The underlying hg-core index |
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
21 |
inner: &'static Index, |
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
22 |
} |
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
23 |
|
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
24 |
impl PySharedIndex { |
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
25 |
/// Return a reference to the inner index, bound by `self` |
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
26 |
pub fn inner(&self) -> &Index { |
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
27 |
self.inner |
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
28 |
} |
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
29 |
|
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
30 |
/// Return an unsafe "faked" `'static` reference to the inner index, for |
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
31 |
/// the purposes of Python <-> Rust memory sharing. |
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
32 |
pub unsafe fn static_inner(&self) -> &'static Index { |
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
33 |
self.inner |
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
34 |
} |
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
35 |
} |
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
36 |
|
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
37 |
impl RevlogIndex for PySharedIndex { |
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
38 |
fn len(&self) -> usize { |
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
39 |
self.inner.len() |
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
40 |
} |
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
41 |
fn node(&self, rev: Revision) -> Option<&Node> { |
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
42 |
self.inner.node(rev) |
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
43 |
} |
acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52791
diff
changeset
|
44 |
} |
52789
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
45 |
|
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
46 |
pub fn py_tuple_to_revision_data_params( |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
47 |
tuple: &Bound<'_, PyTuple>, |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
48 |
) -> PyResult<RevisionDataParams> { |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
49 |
// no need to check length: in PyO3 tup.get_item() does return |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
50 |
// proper errors |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
51 |
let offset_or_flags: u64 = tuple.get_item(0)?.extract()?; |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
52 |
let node_id = tuple |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
53 |
.get_item(7)? |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
54 |
.downcast::<PyBytes>()? |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
55 |
.as_bytes() |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
56 |
.try_into() |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
57 |
.expect("nodeid should be set"); |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
58 |
let flags = (offset_or_flags & 0xFFFF) as u16; |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
59 |
let data_offset = offset_or_flags >> 16; |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
60 |
Ok(RevisionDataParams { |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
61 |
flags, |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
62 |
data_offset, |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
63 |
data_compressed_length: tuple.get_item(1)?.extract()?, |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
64 |
data_uncompressed_length: tuple.get_item(2)?.extract()?, |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
65 |
data_delta_base: tuple.get_item(3)?.extract()?, |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
66 |
link_rev: tuple.get_item(4)?.extract()?, |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
67 |
parent_rev_1: tuple.get_item(5)?.extract()?, |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
68 |
parent_rev_2: tuple.get_item(6)?.extract()?, |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
69 |
node_id, |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
70 |
..Default::default() |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
71 |
}) |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
72 |
} |
52791
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
73 |
|
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
74 |
pub fn revision_data_params_to_py_tuple( |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
75 |
py: Python<'_>, |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
76 |
params: RevisionDataParams, |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
77 |
) -> PyResult<Bound<'_, PyTuple>> { |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
78 |
PyTuple::new( |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
79 |
py, |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
80 |
&[ |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
81 |
params.data_offset.into_pyobject(py)?.into_any(), |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
82 |
params.data_compressed_length.into_pyobject(py)?.into_any(), |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
83 |
params |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
84 |
.data_uncompressed_length |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
85 |
.into_pyobject(py)? |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
86 |
.into_any(), |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
87 |
params.data_delta_base.into_pyobject(py)?.into_any(), |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
88 |
params.link_rev.into_pyobject(py)?.into_any(), |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
89 |
params.parent_rev_1.into_pyobject(py)?.into_any(), |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
90 |
params.parent_rev_2.into_pyobject(py)?.into_any(), |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
91 |
PyBytes::new(py, ¶ms.node_id).into_any().into_any(), |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
92 |
params._sidedata_offset.into_pyobject(py)?.into_any(), |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
93 |
params |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
94 |
._sidedata_compressed_length |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
95 |
.into_pyobject(py)? |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
96 |
.into_any(), |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
97 |
params.data_compression_mode.into_pyobject(py)?.into_any(), |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
98 |
params |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
99 |
._sidedata_compression_mode |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
100 |
.into_pyobject(py)? |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
101 |
.into_any(), |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
102 |
params._rank.into_pyobject(py)?.into_any(), |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
103 |
], |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
104 |
) |
0ac956db7ea7
rust-pyo3-index: __getitem__
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52789
diff
changeset
|
105 |
} |