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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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, &params.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 }