Mercurial > public > mercurial-scm > hg
annotate rust/hg-pyo3/src/revlog/index.rs @ 52792:acae91fad6be
rust-pyo3-revlog: standalone NodeTree class
This is the actual first usage of `PyShareable`, but perhaps
it could be not so much necessary in this case (we could just
reference the `InnerRevlog` python object, and we do not need
to keep additional state).
author | Georges Racinet <georges.racinet@cloudcrane.io> |
---|---|
date | Sun, 22 Dec 2024 17:02:09 +0100 |
parents | 0ac956db7ea7 |
children | bc095c0db77c |
rev | line source |
---|---|
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 } |