comparison rust/hg-cpython/src/revlog.rs @ 51198:52bbb57a76ad

rust-index: results comparison helper with details This is a bit simpler to call and has the advantage of systematically log the encountered deviation. To avoid committing dead code, we apply it to the `pack_header` method, that was already returning the Rust result.
author Georges Racinet <georges.racinet@octobus.net>
date Fri, 29 Sep 2023 15:51:49 +0200
parents bc4d83047c6c
children 16d477bb0078
comparison
equal deleted inserted replaced
51197:bc4d83047c6c 51198:52bbb57a76ad
11 PyRevision, 11 PyRevision,
12 }; 12 };
13 use cpython::{ 13 use cpython::{
14 buffer::{Element, PyBuffer}, 14 buffer::{Element, PyBuffer},
15 exc::{IndexError, ValueError}, 15 exc::{IndexError, ValueError},
16 ObjectProtocol, PyBytes, PyClone, PyDict, PyErr, PyInt, PyModule, 16 ObjectProtocol, PyBool, PyBytes, PyClone, PyDict, PyErr, PyInt, PyModule,
17 PyObject, PyResult, PyString, PyTuple, Python, PythonObject, ToPyObject, 17 PyObject, PyResult, PyString, PyTuple, Python, PythonObject, ToPyObject,
18 }; 18 };
19 use hg::{ 19 use hg::{
20 index::IndexHeader, 20 index::IndexHeader,
21 index::{RevisionDataParams, COMPRESSION_MODE_INLINE}, 21 index::{RevisionDataParams, COMPRESSION_MODE_INLINE},
216 216
217 /// return a binary packed version of the header 217 /// return a binary packed version of the header
218 def pack_header(&self, *args, **kw) -> PyResult<PyObject> { 218 def pack_header(&self, *args, **kw) -> PyResult<PyObject> {
219 let rindex = self.index(py).borrow(); 219 let rindex = self.index(py).borrow();
220 let packed = rindex.pack_header(args.get_item(py, 0).extract(py)?); 220 let packed = rindex.pack_header(args.get_item(py, 0).extract(py)?);
221 let packed = PyBytes::new(py, &packed); 221 let packed = PyBytes::new(py, &packed).into_object();
222 let cpacked = self.call_cindex(py, "pack_header", args, kw)?; 222 let cpacked = self.call_cindex(py, "pack_header", args, kw)?;
223 assert!(packed.as_object().compare(py, cpacked)?.is_eq()); 223 assert_py_eq(py, "pack_header", &packed, &cpacked)?;
224 Ok(packed.into_object()) 224 Ok(packed)
225 } 225 }
226 226
227 /// get an index entry 227 /// get an index entry
228 def get(&self, *args, **kw) -> PyResult<PyObject> { 228 def get(&self, *args, **kw) -> PyResult<PyObject> {
229 self.call_cindex(py, "get", args, kw) 229 self.call_cindex(py, "get", args, kw)
628 NodeMapError::MultipleResults => revlog_error(py), 628 NodeMapError::MultipleResults => revlog_error(py),
629 NodeMapError::RevisionNotInIndex(r) => nodemap_rev_not_in_index(py, r), 629 NodeMapError::RevisionNotInIndex(r) => nodemap_rev_not_in_index(py, r),
630 } 630 }
631 } 631 }
632 632
633 fn assert_py_eq(
634 py: Python,
635 method: &str,
636 rust: &PyObject,
637 c: &PyObject,
638 ) -> PyResult<()> {
639 let locals = PyDict::new(py);
640 locals.set_item(py, "rust".into_py_object(py).into_object(), rust)?;
641 locals.set_item(py, "c".into_py_object(py).into_object(), c)?;
642 let is_eq: PyBool =
643 py.eval("rust == c", None, Some(&locals))?.extract(py)?;
644 assert!(
645 is_eq.is_true(),
646 "{} results differ. Rust: {:?} C: {:?}",
647 method,
648 rust,
649 c
650 );
651 Ok(())
652 }
653
633 /// Create the module, with __package__ given from parent 654 /// Create the module, with __package__ given from parent
634 pub fn init_module(py: Python, package: &str) -> PyResult<PyModule> { 655 pub fn init_module(py: Python, package: &str) -> PyResult<PyModule> {
635 let dotted_name = &format!("{}.revlog", package); 656 let dotted_name = &format!("{}.revlog", package);
636 let m = PyModule::new(py, dotted_name)?; 657 let m = PyModule::new(py, dotted_name)?;
637 m.add(py, "__package__", package)?; 658 m.add(py, "__package__", package)?;