Mercurial > public > mercurial-scm > hg-stable
view rust/hg-cpython/src/utils.rs @ 46626:cb4b0b0c6de4
copies-rust: split up combine_changeset_copies function into a struct
? such that each iteration of its former loop is now a method call,
with the caller driving the loop.
This entirely removes the need for the `DataHolder` hack:
the method now takes a `ChangedFiles<'_>` parameter that borrows
a bytes buffer that can be owned by the caller?s stack frame,
just for the duration of that call.
Differential Revision: https://phab.mercurial-scm.org/D9683
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Tue, 05 Jan 2021 21:02:00 +0100 |
parents | 26114bd6ec60 |
children | c7fb9b74e753 |
line wrap: on
line source
use cpython::exc::ValueError; use cpython::{PyBytes, PyDict, PyErr, PyObject, PyResult, PyTuple, Python}; use hg::revlog::Node; use std::convert::TryFrom; #[allow(unused)] pub fn print_python_trace(py: Python) -> PyResult<PyObject> { eprintln!("==============================="); eprintln!("Printing Python stack from Rust"); eprintln!("==============================="); let traceback = py.import("traceback")?; let sys = py.import("sys")?; let kwargs = PyDict::new(py); kwargs.set_item(py, "file", sys.get(py, "stderr")?)?; traceback.call(py, "print_stack", PyTuple::new(py, &[]), Some(&kwargs)) } // Necessary evil for the time being, could maybe be moved to // a TryFrom in Node itself const NODE_BYTES_LENGTH: usize = 20; type NodeData = [u8; NODE_BYTES_LENGTH]; /// Copy incoming Python bytes given as `PyObject` into `Node`, /// doing the necessary checks pub fn node_from_py_object<'a>( py: Python, bytes: &'a PyObject, ) -> PyResult<Node> { let as_py_bytes: &'a PyBytes = bytes.extract(py)?; node_from_py_bytes(py, as_py_bytes) } /// Clone incoming Python bytes given as `PyBytes` as a `Node`, /// doing the necessary checks. pub fn node_from_py_bytes(py: Python, bytes: &PyBytes) -> PyResult<Node> { <NodeData>::try_from(bytes.data(py)) .map_err(|_| { PyErr::new::<ValueError, _>( py, format!("{}-byte hash required", NODE_BYTES_LENGTH), ) }) .map(Into::into) }