rust/hg-pyo3/src/revlog/index.rs
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--
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).
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
}