rust-python-index: don't panic on a corrupted index when calling from Python
authorRaphaël Gomès <rgomes@octobus.net>
Tue, 31 Oct 2023 17:36:59 +0100
changeset 51231 5807e3a8865e
parent 51230 f9a52a9603f9
child 51232 3551f2a1c963
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.
rust/hg-cpython/src/revlog.rs
--- 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.