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