rust/hg-pyo3/src/exceptions.rs
author Georges Racinet <georges.racinet@cloudcrane.io>
Wed, 29 Jan 2025 14:05:26 +0100
changeset 52857 e7b825893e1b
parent 52853 c6707e112d96
child 52859 9f083ff3c96c
permissions -rw-r--r--
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.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
}