@@ -7,14 +7,17 @@
use crate::cindex;
use cpython::{
- ObjectProtocol, PyClone, PyDict, PyModule, PyObject, PyResult, PyTuple, Python, PythonObject,
- ToPyObject,
+ ObjectProtocol, PyClone, PyDict, PyModule, PyObject, PyResult, PyTuple,
+ Python, PythonObject, ToPyObject,
};
use hg::Revision;
use std::cell::RefCell;
/// Return a Struct implementing the Graph trait
-pub(crate) fn pyindex_to_graph(py: Python, index: PyObject) -> PyResult<cindex::Index> {
+pub(crate) fn pyindex_to_graph(
+ py: Python,
+ index: PyObject,
+) -> PyResult<cindex::Index> {
match index.extract::<MixedIndex>(py) {
Ok(midx) => Ok(midx.clone_cindex(py)),
Err(_) => cindex::Index::new(py, index),
@@ -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,
})
}
@@ -38,6 +38,7 @@
} nodetreenode;
typedef struct {
+ int abi_version;
int (*index_parents)(PyObject *, int, int *);
} Revlog_CAPI;
@@ -3037,6 +3038,9 @@
#endif /* WITH_RUST */
static Revlog_CAPI CAPI = {
+ /* increment the abi_version field upon each change in the Revlog_CAPI
+ struct or in the ABI of the listed functions */
+ 1,
HgRevlogIndex_GetParents,
};