annotate rust/hg-pyo3/src/exceptions.rs @ 52857:e7b825893e1b

rust-pyo3-dirsate: DirstateMap definition and constructors With rust-cpython, using `Option<T>` in the Rust signature would translate automatically into a Python keyword argument, leading to unpleasantness on the Rust side in some cases (not here, though). with PyO3, though the signature can be specified explicitly (positional in this case) and there is even a warning that the implicit keywords style is deprecated.
author Georges Racinet <georges.racinet@cloudcrane.io>
date Wed, 29 Jan 2025 14:05:26 +0100
parents c6707e112d96
children 9f083ff3c96c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
52853
c6707e112d96 rust-pyo3-dirstate: exceptions for dirstate errors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52850
diff changeset
1 use pyo3::exceptions::{PyOSError, PyRuntimeError, PyValueError};
52412
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
2 use pyo3::import_exception;
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
3 use pyo3::{create_exception, PyErr};
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
4
52853
c6707e112d96 rust-pyo3-dirstate: exceptions for dirstate errors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52850
diff changeset
5 use hg::dirstate::{on_disk::DirstateV2ParseError, DirstateError};
c6707e112d96 rust-pyo3-dirstate: exceptions for dirstate errors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52850
diff changeset
6
52781
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
7 use hg::revlog::nodemap::NodeMapError;
52790
1b9907575768 rust-pyo3-revlog: helpers for revision checks
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
8 use hg::UncheckedRevision;
52781
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
9
52412
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
10 use crate::revision::PyRevision;
52408
20c0472b2ab7 rust-pyo3: defining GraphError
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
11
20c0472b2ab7 rust-pyo3: defining GraphError
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
12 create_exception!(pyo3_rustext, GraphError, PyValueError);
52850
ffda57aa98fa rust-pyo3-dirstate: defining FallbackError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
13 create_exception!(pyo3_rustext, FallbackError, PyRuntimeError);
52412
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
14 import_exception!(mercurial.error, WdirUnsupported);
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
15
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
16 impl GraphError {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
17 pub fn from_hg(inner: hg::GraphError) -> PyErr {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
18 match inner {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
19 hg::GraphError::ParentOutOfRange(r) => {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
20 GraphError::new_err(("ParentOutOfRange", PyRevision(r.0)))
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
21 }
52771
2fb13c3f4496 rust: add GraphError::ParentOutOfOrder
Mitchell Kember <mkember@janestreet.com>
parents: 52531
diff changeset
22 hg::GraphError::ParentOutOfOrder(r) => {
2fb13c3f4496 rust: add GraphError::ParentOutOfOrder
Mitchell Kember <mkember@janestreet.com>
parents: 52531
diff changeset
23 GraphError::new_err(("ParentOutOfOrder", PyRevision(r.0)))
2fb13c3f4496 rust: add GraphError::ParentOutOfOrder
Mitchell Kember <mkember@janestreet.com>
parents: 52531
diff changeset
24 }
52412
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
25 }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
26 }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
27 pub fn from_vcsgraph(inner: vcsgraph::graph::GraphReadError) -> PyErr {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
28 match inner {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
29 vcsgraph::graph::GraphReadError::InconsistentGraphData => {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
30 GraphError::new_err("InconsistentGraphData")
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
31 }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
32 vcsgraph::graph::GraphReadError::InvalidKey => {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
33 GraphError::new_err("ParentOutOfRange")
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
34 }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
35 vcsgraph::graph::GraphReadError::KeyedInvalidKey(r) => {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
36 GraphError::new_err(("ParentOutOfRange", r))
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
37 }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
38 vcsgraph::graph::GraphReadError::WorkingDirectoryUnsupported => {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
39 WdirUnsupported::new_err(())
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
40 }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
41 }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
42 }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
43 }
52531
4c9e31984b3a rust-pyo3: exposition of AncestorsIterator
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52412
diff changeset
44
4c9e31984b3a rust-pyo3: exposition of AncestorsIterator
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52412
diff changeset
45 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: 52412
diff changeset
46 PyRuntimeError::new_err(format!("In Rust PyO3 bindings: {e}"))
4c9e31984b3a rust-pyo3: exposition of AncestorsIterator
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52412
diff changeset
47 }
52777
32008b1e7104 rust-pyo3-revlog: Python RevlogError with helper
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52771
diff changeset
48
52784
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
49 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: 52782
diff changeset
50 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: 52782
diff changeset
51 }
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
52
52777
32008b1e7104 rust-pyo3-revlog: Python RevlogError with helper
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52771
diff changeset
53 pub mod mercurial_py_errors {
32008b1e7104 rust-pyo3-revlog: Python RevlogError with helper
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52771
diff changeset
54 pyo3::import_exception!(mercurial.error, RevlogError);
32008b1e7104 rust-pyo3-revlog: Python RevlogError with helper
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52771
diff changeset
55 }
32008b1e7104 rust-pyo3-revlog: Python RevlogError with helper
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52771
diff changeset
56
32008b1e7104 rust-pyo3-revlog: Python RevlogError with helper
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52771
diff changeset
57 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: 52771
diff changeset
58 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: 52771
diff changeset
59 }
52781
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
60
52786
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
61 pub fn revlog_error_bare() -> PyErr {
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
62 mercurial_py_errors::RevlogError::new_err((None::<String>,))
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
63 }
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
64
52790
1b9907575768 rust-pyo3-revlog: helpers for revision checks
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
65 pub fn rev_not_in_index(rev: UncheckedRevision) -> PyErr {
1b9907575768 rust-pyo3-revlog: helpers for revision checks
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
66 PyValueError::new_err(format!("revlog index out of range: {}", rev))
1b9907575768 rust-pyo3-revlog: helpers for revision checks
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
67 }
1b9907575768 rust-pyo3-revlog: helpers for revision checks
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
68
52781
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
69 pub fn nodemap_error(err: NodeMapError) -> PyErr {
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
70 match err {
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
71 NodeMapError::MultipleResults => {
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
72 mercurial_py_errors::RevlogError::new_err("")
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
73 }
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
74
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
75 NodeMapError::RevisionNotInIndex(rev) => {
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
76 PyValueError::new_err(format!(
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
77 "Inconsistency: Revision {} found in nodemap \
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
78 is not in revlog index",
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
79 rev
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
80 ))
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
81 }
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
82 }
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
83 }
52795
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
84
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
85 pub fn graph_error(_err: hg::GraphError) -> PyErr {
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
86 // ParentOutOfRange is currently the only alternative
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
87 // in `hg::GraphError`. The C index always raises this simple ValueError.
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
88 PyValueError::new_err("parent out of range")
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
89 }
52853
c6707e112d96 rust-pyo3-dirstate: exceptions for dirstate errors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52850
diff changeset
90
c6707e112d96 rust-pyo3-dirstate: exceptions for dirstate errors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52850
diff changeset
91 pub fn dirstate_error(err: DirstateError) -> PyErr {
c6707e112d96 rust-pyo3-dirstate: exceptions for dirstate errors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52850
diff changeset
92 PyOSError::new_err(format!("Dirstate error: {:?}", err))
c6707e112d96 rust-pyo3-dirstate: exceptions for dirstate errors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52850
diff changeset
93 }
c6707e112d96 rust-pyo3-dirstate: exceptions for dirstate errors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52850
diff changeset
94
c6707e112d96 rust-pyo3-dirstate: exceptions for dirstate errors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52850
diff changeset
95 #[allow(dead_code)]
c6707e112d96 rust-pyo3-dirstate: exceptions for dirstate errors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52850
diff changeset
96 pub fn dirstate_v2_error(_err: DirstateV2ParseError) -> PyErr {
c6707e112d96 rust-pyo3-dirstate: exceptions for dirstate errors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52850
diff changeset
97 PyValueError::new_err("corrupted dirstate-v2")
c6707e112d96 rust-pyo3-dirstate: exceptions for dirstate errors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52850
diff changeset
98 }