rust-python-index: don't panic on a corrupted index when calling from Python
This makes `test-verify.t` pass again. In an ideal world, we would find
the exact commit where this test breaks and amend part of this change there,
but this is a long enough series.
--- a/rust/hg-cpython/src/revlog.rs Tue Oct 31 17:34:31 2023 +0100
+++ b/rust/hg-cpython/src/revlog.rs Tue Oct 31 17:36:59 2023 +0100
@@ -675,7 +675,9 @@
.expect("default header is broken")
.unwrap(),
)
- .unwrap(),
+ .map_err(|e| {
+ revlog_error_with_msg(py, e.to_string().as_bytes())
+ })?,
),
RefCell::new(None),
RefCell::new(None),
@@ -1052,6 +1054,21 @@
}
}
+fn revlog_error_with_msg(py: Python, msg: &[u8]) -> PyErr {
+ match py
+ .import("mercurial.error")
+ .and_then(|m| m.get(py, "RevlogError"))
+ {
+ Err(e) => e,
+ Ok(cls) => PyErr::from_instance(
+ py,
+ cls.call(py, (PyBytes::new(py, msg),), None)
+ .ok()
+ .into_py_object(py),
+ ),
+ }
+}
+
fn graph_error(py: Python, _err: hg::GraphError) -> PyErr {
// ParentOutOfRange is currently the only alternative
// in `hg::GraphError`. The C index always raises this simple ValueError.