Mercurial > public > mercurial-scm > hg
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 |
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 } |