rust/hg-cpython/src/cindex.rs
changeset 44066 f5d2720f3bea
parent 44010 2728fcb8127c
child 44502 166349510398
--- a/rust/hg-cpython/src/cindex.rs	Mon Jan 13 19:11:44 2020 -0800
+++ b/rust/hg-cpython/src/cindex.rs	Tue Jan 14 12:04:12 2020 +0100
@@ -10,12 +10,15 @@
 //! Ideally, we should use an Index entirely implemented in Rust,
 //! but this will take some time to get there.
 
-use cpython::{PyClone, PyObject, PyResult, Python};
+use cpython::{exc::ImportError, PyClone, PyErr, PyObject, PyResult, Python};
 use hg::{Graph, GraphError, Revision, WORKING_DIRECTORY_REVISION};
 use libc::c_int;
 
+const REVLOG_CABI_VERSION: c_int = 1;
+
 #[repr(C)]
 pub struct Revlog_CAPI {
+    abi_version: c_int,
     index_parents: unsafe extern "C" fn(
         index: *mut revlog_capi::RawPyObject,
         rev: c_int,
@@ -66,9 +69,20 @@
 
 impl Index {
     pub fn new(py: Python, index: PyObject) -> PyResult<Self> {
+        let capi = unsafe { revlog_capi::retrieve(py)? };
+        if capi.abi_version != REVLOG_CABI_VERSION {
+            return Err(PyErr::new::<ImportError, _>(
+                py,
+                format!(
+                    "ABI version mismatch: the C ABI revlog version {} \
+                     does not match the {} expected by Rust hg-cpython",
+                    capi.abi_version, REVLOG_CABI_VERSION
+                ),
+            ));
+        }
         Ok(Index {
             index: index,
-            capi: unsafe { revlog_capi::retrieve(py)? },
+            capi: capi,
         })
     }