D7856: revlog-native: introduced ABI version in capsule

gracinet (Georges Racinet) phabricator at mercurial-scm.org
Tue Jan 14 09:22:32 EST 2020


Closed by commit rHGe300421d67f5: revlog-native: introduced ABI version in capsule (authored by gracinet).
This revision was automatically updated to reflect the committed changes.
This revision was not accepted when it landed; it landed in state "Needs Review".

CHANGED PRIOR TO COMMIT
  https://phab.mercurial-scm.org/D7856?vs=19204&id=19207#toc

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D7856?vs=19204&id=19207

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D7856/new/

REVISION DETAIL
  https://phab.mercurial-scm.org/D7856

AFFECTED FILES
  mercurial/cext/revlog.c
  rust/hg-cpython/src/cindex.rs

CHANGE DETAILS

diff --git a/rust/hg-cpython/src/cindex.rs b/rust/hg-cpython/src/cindex.rs
--- a/rust/hg-cpython/src/cindex.rs
+++ b/rust/hg-cpython/src/cindex.rs
@@ -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,
         })
     }
 
diff --git a/mercurial/cext/revlog.c b/mercurial/cext/revlog.c
--- a/mercurial/cext/revlog.c
+++ b/mercurial/cext/revlog.c
@@ -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,
 };
 



To: gracinet, #hg-reviewers
Cc: yuja, durin42, kevincox, mercurial-devel


More information about the Mercurial-devel mailing list