annotate rust/hg-pyo3/src/node.rs @ 52864:d961e09d3d8c

rust-pyo3-dirstate: DirstateMap mutating methods except CopyMap related Here we noticed a discrepancy in the truncated timestamps with what `DirstateItem` uses. More domain knowledge would be needed to decide whether it is normal or it would require some cleanup.
author Georges Racinet <georges.racinet@cloudcrane.io>
date Thu, 30 Jan 2025 12:24:41 +0100
parents e2d2961b8383
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
52785
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
1 use pyo3::exceptions::PyValueError;
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
2 use pyo3::prelude::*;
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
3 use pyo3::types::PyBytes;
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
4
52856
e2d2961b8383 rust-pyo3: implementing IntoPyObject for Node
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
5 use std::convert::Infallible;
e2d2961b8383 rust-pyo3: implementing IntoPyObject for Node
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
6
52785
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
7 use hg::revlog::RevlogIndex;
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
8 use hg::{
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
9 revlog::index::Index, revlog::node::NODE_BYTES_LENGTH, Node, NodePrefix,
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
10 Revision,
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
11 };
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
12
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
13 #[derive(Debug, Copy, Clone, PartialEq, derive_more::From)]
52856
e2d2961b8383 rust-pyo3: implementing IntoPyObject for Node
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
14 pub struct PyNode(pub Node);
e2d2961b8383 rust-pyo3: implementing IntoPyObject for Node
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
15
e2d2961b8383 rust-pyo3: implementing IntoPyObject for Node
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
16 impl<'py> IntoPyObject<'py> for PyNode {
e2d2961b8383 rust-pyo3: implementing IntoPyObject for Node
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
17 type Target = PyBytes;
e2d2961b8383 rust-pyo3: implementing IntoPyObject for Node
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
18 type Output = Bound<'py, Self::Target>;
e2d2961b8383 rust-pyo3: implementing IntoPyObject for Node
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
19 type Error = Infallible;
e2d2961b8383 rust-pyo3: implementing IntoPyObject for Node
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
20
e2d2961b8383 rust-pyo3: implementing IntoPyObject for Node
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
21 fn into_pyobject(
e2d2961b8383 rust-pyo3: implementing IntoPyObject for Node
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
22 self,
e2d2961b8383 rust-pyo3: implementing IntoPyObject for Node
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
23 py: Python<'py>,
e2d2961b8383 rust-pyo3: implementing IntoPyObject for Node
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
24 ) -> Result<Self::Output, Self::Error> {
e2d2961b8383 rust-pyo3: implementing IntoPyObject for Node
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
25 Ok(PyBytes::new(py, self.0.as_bytes()))
e2d2961b8383 rust-pyo3: implementing IntoPyObject for Node
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
26 }
e2d2961b8383 rust-pyo3: implementing IntoPyObject for Node
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
27 }
52785
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
28
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
29 /// Copy incoming Python binary Node ID into [`Node`]
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
30 ///
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
31 /// # Python exceptions
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
32 /// Raises `ValueError` if length is not as expected
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
33 pub fn node_from_py_bytes(bytes: &Bound<'_, PyBytes>) -> PyResult<Node> {
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
34 Node::try_from(bytes.as_bytes()).map_err(|_| {
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
35 PyValueError::new_err(format!(
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
36 "{}-byte hash required",
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
37 NODE_BYTES_LENGTH
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
38 ))
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
39 })
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
40 }
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
41
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
42 /// Convert Python hexadecimal Node ID node or prefix given as `bytes` into
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
43 /// [`NodePrefix`].
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
44 ///
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
45 /// # Python exceptions
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
46 /// Raises `ValueError` if the incoming `bytes` is invalid.
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
47 pub fn node_prefix_from_py_bytes(
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
48 bytes: &Bound<'_, PyBytes>,
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
49 ) -> PyResult<NodePrefix> {
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
50 let as_bytes = bytes.as_bytes();
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
51 NodePrefix::from_hex(as_bytes).map_err(|_| {
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
52 PyValueError::new_err(format!(
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
53 "Invalid node or prefix '{}'",
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
54 String::from_utf8_lossy(as_bytes)
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
55 ))
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
56 })
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
57 }
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
58
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
59 /// Return the binary node from a checked revision
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
60 ///
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
61 /// This is meant to be used on revisions already checked to exist,
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
62 /// typically obtained from a NodeTree lookup.
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
63 ///
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
64 /// # Panics
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
65 /// Panics if the revision does not exist
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
66 pub fn py_node_for_rev<'py>(
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
67 py: Python<'py>,
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
68 idx: &Index,
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
69 rev: Revision,
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
70 ) -> Bound<'py, PyBytes> {
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
71 PyBytes::new(py, idx.node(rev).expect("node should exist").as_bytes())
71ebe880f24a hg-pyo3-revlog: Node conversion utilities
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
72 }