Mercurial > public > mercurial-scm > hg-stable
annotate rust/hg-pyo3/src/exceptions.rs @ 52799:4e34e8fd46d4
rust-pyo3-revlog: nodemap based index methods
They are rather straightforward, except for `_index_get_rev`
that takes care of not initializing a nodetree on some conditions.
In `_index_partialmatch`, we solve the todo that was in the
`hg-cpython`, since we introduced the `py_node_for_rev` helper earlier.
The new test method in `test-rust-revlog.py` provides comparison
with the `hg-cpython` implementation of `InnerRevlog`.
author | Georges Racinet <georges.racinet@cloudcrane.io> |
---|---|
date | Wed, 25 Dec 2024 16:16:22 +0100 |
parents | 5e3e8876fd9e |
children | 1b9907575768 |
rev | line source |
---|---|
52558
4c9e31984b3a
rust-pyo3: exposition of AncestorsIterator
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52443
diff
changeset
|
1 use pyo3::exceptions::{PyRuntimeError, PyValueError}; |
52443
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
2 use pyo3::import_exception; |
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
3 use pyo3::{create_exception, PyErr}; |
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
4 |
52794
918239b55b3a
rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52793
diff
changeset
|
5 use hg::revlog::nodemap::NodeMapError; |
918239b55b3a
rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52793
diff
changeset
|
6 |
52443
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
7 use crate::revision::PyRevision; |
52439
20c0472b2ab7
rust-pyo3: defining GraphError
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
8 |
20c0472b2ab7
rust-pyo3: defining GraphError
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff
changeset
|
9 create_exception!(pyo3_rustext, GraphError, PyValueError); |
52443
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
10 import_exception!(mercurial.error, WdirUnsupported); |
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
11 |
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
12 impl GraphError { |
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
13 pub fn from_hg(inner: hg::GraphError) -> PyErr { |
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
14 match inner { |
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
15 hg::GraphError::ParentOutOfRange(r) => { |
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
16 GraphError::new_err(("ParentOutOfRange", PyRevision(r.0))) |
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
17 } |
52785
2fb13c3f4496
rust: add GraphError::ParentOutOfOrder
Mitchell Kember <mkember@janestreet.com>
parents:
52558
diff
changeset
|
18 hg::GraphError::ParentOutOfOrder(r) => { |
2fb13c3f4496
rust: add GraphError::ParentOutOfOrder
Mitchell Kember <mkember@janestreet.com>
parents:
52558
diff
changeset
|
19 GraphError::new_err(("ParentOutOfOrder", PyRevision(r.0))) |
2fb13c3f4496
rust: add GraphError::ParentOutOfOrder
Mitchell Kember <mkember@janestreet.com>
parents:
52558
diff
changeset
|
20 } |
52443
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
21 } |
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
22 } |
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
23 pub fn from_vcsgraph(inner: vcsgraph::graph::GraphReadError) -> PyErr { |
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
24 match inner { |
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
25 vcsgraph::graph::GraphReadError::InconsistentGraphData => { |
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
26 GraphError::new_err("InconsistentGraphData") |
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
27 } |
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
28 vcsgraph::graph::GraphReadError::InvalidKey => { |
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
29 GraphError::new_err("ParentOutOfRange") |
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
30 } |
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
31 vcsgraph::graph::GraphReadError::KeyedInvalidKey(r) => { |
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
32 GraphError::new_err(("ParentOutOfRange", r)) |
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
33 } |
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
34 vcsgraph::graph::GraphReadError::WorkingDirectoryUnsupported => { |
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
35 WdirUnsupported::new_err(()) |
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
36 } |
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
37 } |
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
38 } |
6e8ba52857df
rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents:
52439
diff
changeset
|
39 } |
52558
4c9e31984b3a
rust-pyo3: exposition of AncestorsIterator
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52443
diff
changeset
|
40 |
4c9e31984b3a
rust-pyo3: exposition of AncestorsIterator
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52443
diff
changeset
|
41 pub fn map_lock_error<T>(e: std::sync::PoisonError<T>) -> PyErr { |
4c9e31984b3a
rust-pyo3: exposition of AncestorsIterator
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52443
diff
changeset
|
42 PyRuntimeError::new_err(format!("In Rust PyO3 bindings: {e}")) |
4c9e31984b3a
rust-pyo3: exposition of AncestorsIterator
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52443
diff
changeset
|
43 } |
52790
32008b1e7104
rust-pyo3-revlog: Python RevlogError with helper
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52785
diff
changeset
|
44 |
52797
5e3e8876fd9e
rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52795
diff
changeset
|
45 pub fn map_try_lock_error<T>(e: std::sync::TryLockError<T>) -> PyErr { |
5e3e8876fd9e
rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52795
diff
changeset
|
46 PyRuntimeError::new_err(format!("In Rust PyO3 bindings: {e}")) |
5e3e8876fd9e
rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52795
diff
changeset
|
47 } |
5e3e8876fd9e
rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52795
diff
changeset
|
48 |
52790
32008b1e7104
rust-pyo3-revlog: Python RevlogError with helper
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52785
diff
changeset
|
49 pub mod mercurial_py_errors { |
32008b1e7104
rust-pyo3-revlog: Python RevlogError with helper
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52785
diff
changeset
|
50 pyo3::import_exception!(mercurial.error, RevlogError); |
32008b1e7104
rust-pyo3-revlog: Python RevlogError with helper
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52785
diff
changeset
|
51 } |
32008b1e7104
rust-pyo3-revlog: Python RevlogError with helper
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52785
diff
changeset
|
52 |
32008b1e7104
rust-pyo3-revlog: Python RevlogError with helper
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52785
diff
changeset
|
53 pub fn revlog_error_from_msg(e: impl ToString) -> PyErr { |
32008b1e7104
rust-pyo3-revlog: Python RevlogError with helper
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52785
diff
changeset
|
54 mercurial_py_errors::RevlogError::new_err(e.to_string().into_bytes()) |
32008b1e7104
rust-pyo3-revlog: Python RevlogError with helper
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52785
diff
changeset
|
55 } |
52794
918239b55b3a
rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52793
diff
changeset
|
56 |
52799
4e34e8fd46d4
rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52797
diff
changeset
|
57 pub fn revlog_error_bare() -> PyErr { |
4e34e8fd46d4
rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52797
diff
changeset
|
58 mercurial_py_errors::RevlogError::new_err((None::<String>,)) |
4e34e8fd46d4
rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52797
diff
changeset
|
59 } |
4e34e8fd46d4
rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52797
diff
changeset
|
60 |
52794
918239b55b3a
rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52793
diff
changeset
|
61 pub fn nodemap_error(err: NodeMapError) -> PyErr { |
918239b55b3a
rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52793
diff
changeset
|
62 match err { |
918239b55b3a
rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52793
diff
changeset
|
63 NodeMapError::MultipleResults => { |
918239b55b3a
rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52793
diff
changeset
|
64 mercurial_py_errors::RevlogError::new_err("") |
918239b55b3a
rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52793
diff
changeset
|
65 } |
918239b55b3a
rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52793
diff
changeset
|
66 |
918239b55b3a
rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52793
diff
changeset
|
67 NodeMapError::RevisionNotInIndex(rev) => { |
918239b55b3a
rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52793
diff
changeset
|
68 PyValueError::new_err(format!( |
918239b55b3a
rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52793
diff
changeset
|
69 "Inconsistency: Revision {} found in nodemap \ |
918239b55b3a
rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52793
diff
changeset
|
70 is not in revlog index", |
918239b55b3a
rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52793
diff
changeset
|
71 rev |
918239b55b3a
rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52793
diff
changeset
|
72 )) |
918239b55b3a
rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52793
diff
changeset
|
73 } |
918239b55b3a
rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52793
diff
changeset
|
74 } |
918239b55b3a
rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
52793
diff
changeset
|
75 } |