Mercurial > public > mercurial-scm > hg
annotate rust/hg-pyo3/src/revlog/index.rs @ 52789:34f44aa5e844
rust-pyo3-index: first mutating methods
This brings in `append()` and `__delitem__`, and is for us the
first validation of our inner mutability.
In the case of `__delitem__`, there was a tricky case where we
were tempted to use the higher level `PySlice::indices` API, with
a possible dangerous change of behaviour. We test it carefully from
the Python side.
author | Georges Racinet <georges.racinet@cloudcrane.io> |
---|---|
date | Wed, 25 Dec 2024 17:17:47 +0100 |
parents | |
children | 0ac956db7ea7 |
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 |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
13 use hg::revlog::index::RevisionDataParams; |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
14 |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
15 pub fn py_tuple_to_revision_data_params( |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
16 tuple: &Bound<'_, PyTuple>, |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
17 ) -> PyResult<RevisionDataParams> { |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
18 // 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
|
19 // proper errors |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
20 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
|
21 let node_id = tuple |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
22 .get_item(7)? |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
23 .downcast::<PyBytes>()? |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
24 .as_bytes() |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
25 .try_into() |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
26 .expect("nodeid should be set"); |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
27 let flags = (offset_or_flags & 0xFFFF) as u16; |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
28 let data_offset = offset_or_flags >> 16; |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
29 Ok(RevisionDataParams { |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
30 flags, |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
31 data_offset, |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
32 data_compressed_length: tuple.get_item(1)?.extract()?, |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
33 data_uncompressed_length: tuple.get_item(2)?.extract()?, |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
34 data_delta_base: tuple.get_item(3)?.extract()?, |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
35 link_rev: tuple.get_item(4)?.extract()?, |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
36 parent_rev_1: tuple.get_item(5)?.extract()?, |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
37 parent_rev_2: tuple.get_item(6)?.extract()?, |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
38 node_id, |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
39 ..Default::default() |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
40 }) |
34f44aa5e844
rust-pyo3-index: first mutating methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
41 } |