annotate rust/hg-pyo3/src/exceptions.rs @ 53042:cdd7bf612c7b stable tip

bundle-spec: properly format boolean parameter (issue6960) This was breaking automatic clone bundle generation. This changeset fixes it and add a test to catch it in the future.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Tue, 11 Mar 2025 02:29:42 +0100
parents d961e09d3d8c
children
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
52863
ab6198160960 rust-pyo3-exceptions: helper for ValueError by calling to_string
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52859
diff changeset
5 use std::fmt::Display;
ab6198160960 rust-pyo3-exceptions: helper for ValueError by calling to_string
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52859
diff changeset
6
52853
c6707e112d96 rust-pyo3-dirstate: exceptions for dirstate errors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52850
diff changeset
7 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
8
52781
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
9 use hg::revlog::nodemap::NodeMapError;
52790
1b9907575768 rust-pyo3-revlog: helpers for revision checks
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
10 use hg::UncheckedRevision;
52781
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
11
52412
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
12 use crate::revision::PyRevision;
52408
20c0472b2ab7 rust-pyo3: defining GraphError
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
13
20c0472b2ab7 rust-pyo3: defining GraphError
Georges Racinet <georges.racinet@cloudcrane.io>
parents:
diff changeset
14 create_exception!(pyo3_rustext, GraphError, PyValueError);
52850
ffda57aa98fa rust-pyo3-dirstate: defining FallbackError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52795
diff changeset
15 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
16 import_exception!(mercurial.error, WdirUnsupported);
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
17
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
18 impl GraphError {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
19 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
20 match inner {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
21 hg::GraphError::ParentOutOfRange(r) => {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
22 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
23 }
52771
2fb13c3f4496 rust: add GraphError::ParentOutOfOrder
Mitchell Kember <mkember@janestreet.com>
parents: 52531
diff changeset
24 hg::GraphError::ParentOutOfOrder(r) => {
2fb13c3f4496 rust: add GraphError::ParentOutOfOrder
Mitchell Kember <mkember@janestreet.com>
parents: 52531
diff changeset
25 GraphError::new_err(("ParentOutOfOrder", PyRevision(r.0)))
2fb13c3f4496 rust: add GraphError::ParentOutOfOrder
Mitchell Kember <mkember@janestreet.com>
parents: 52531
diff changeset
26 }
52412
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
27 }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
28 }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
29 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
30 match inner {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
31 vcsgraph::graph::GraphReadError::InconsistentGraphData => {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
32 GraphError::new_err("InconsistentGraphData")
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
33 }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
34 vcsgraph::graph::GraphReadError::InvalidKey => {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
35 GraphError::new_err("ParentOutOfRange")
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
36 }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
37 vcsgraph::graph::GraphReadError::KeyedInvalidKey(r) => {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
38 GraphError::new_err(("ParentOutOfRange", r))
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
39 }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
40 vcsgraph::graph::GraphReadError::WorkingDirectoryUnsupported => {
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
41 WdirUnsupported::new_err(())
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 }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
44 }
6e8ba52857df rust-pyo3: conversions to GraphError Python exception
Georges Racinet <georges.racinet@octobus.net>
parents: 52408
diff changeset
45 }
52531
4c9e31984b3a rust-pyo3: exposition of AncestorsIterator
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52412
diff changeset
46
4c9e31984b3a rust-pyo3: exposition of AncestorsIterator
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52412
diff changeset
47 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
48 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
49 }
52777
32008b1e7104 rust-pyo3-revlog: Python RevlogError with helper
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52771
diff changeset
50
52784
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
51 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
52 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
53 }
5e3e8876fd9e rust-pyo3-revlog: index and nodetree read accessor helpers
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52782
diff changeset
54
52863
ab6198160960 rust-pyo3-exceptions: helper for ValueError by calling to_string
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52859
diff changeset
55 pub fn to_string_value_error<T: Display>(e: T) -> PyErr {
ab6198160960 rust-pyo3-exceptions: helper for ValueError by calling to_string
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52859
diff changeset
56 PyValueError::new_err(e.to_string())
ab6198160960 rust-pyo3-exceptions: helper for ValueError by calling to_string
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52859
diff changeset
57 }
ab6198160960 rust-pyo3-exceptions: helper for ValueError by calling to_string
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52859
diff changeset
58
52777
32008b1e7104 rust-pyo3-revlog: Python RevlogError with helper
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52771
diff changeset
59 pub mod mercurial_py_errors {
32008b1e7104 rust-pyo3-revlog: Python RevlogError with helper
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52771
diff changeset
60 pyo3::import_exception!(mercurial.error, RevlogError);
32008b1e7104 rust-pyo3-revlog: Python RevlogError with helper
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52771
diff changeset
61 }
32008b1e7104 rust-pyo3-revlog: Python RevlogError with helper
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52771
diff changeset
62
32008b1e7104 rust-pyo3-revlog: Python RevlogError with helper
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52771
diff changeset
63 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
64 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
65 }
52781
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
66
52786
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
67 pub fn revlog_error_bare() -> PyErr {
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
68 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
69 }
4e34e8fd46d4 rust-pyo3-revlog: nodemap based index methods
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52784
diff changeset
70
52790
1b9907575768 rust-pyo3-revlog: helpers for revision checks
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
71 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
72 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
73 }
1b9907575768 rust-pyo3-revlog: helpers for revision checks
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52786
diff changeset
74
52781
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
75 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
76 match err {
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
77 NodeMapError::MultipleResults => {
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
78 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
79 }
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 NodeMapError::RevisionNotInIndex(rev) => {
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
82 PyValueError::new_err(format!(
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
83 "Inconsistency: Revision {} found in nodemap \
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
84 is not in revlog index",
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
85 rev
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
86 ))
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
87 }
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
88 }
918239b55b3a rust-pyo3-revlog: converting NodeMapError to Python ValueError
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52780
diff changeset
89 }
52795
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
90
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
91 pub fn graph_error(_err: hg::GraphError) -> PyErr {
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
92 // ParentOutOfRange is currently the only alternative
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
93 // 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
94 PyValueError::new_err("parent out of range")
adf91dfe6c04 rust-pyo3-index: _index_headrevs
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52792
diff changeset
95 }
52853
c6707e112d96 rust-pyo3-dirstate: exceptions for dirstate errors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52850
diff changeset
96
c6707e112d96 rust-pyo3-dirstate: exceptions for dirstate errors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52850
diff changeset
97 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
98 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
99 }
c6707e112d96 rust-pyo3-dirstate: exceptions for dirstate errors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52850
diff changeset
100
c6707e112d96 rust-pyo3-dirstate: exceptions for dirstate errors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52850
diff changeset
101 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
102 PyValueError::new_err("corrupted dirstate-v2")
c6707e112d96 rust-pyo3-dirstate: exceptions for dirstate errors
Georges Racinet <georges.racinet@cloudcrane.io>
parents: 52850
diff changeset
103 }