# HG changeset patch # User Yuya Nishihara # Date 1566032768 -32400 # Node ID 79561843729af8bf73d50cc205ea0e8af45412e1 # Parent 5399532510aed5857509558c31dbeb3c909760e8 rust-dirstate: handle invalid length of p1/p2 parameters It uses match syntax since map_err() failed to deduce the argument type. diff -r 5399532510ae -r 79561843729a rust/hg-cpython/src/dirstate/dirstate_map.rs --- a/rust/hg-cpython/src/dirstate/dirstate_map.rs Sat Aug 17 11:37:42 2019 +0900 +++ b/rust/hg-cpython/src/dirstate/dirstate_map.rs Sat Aug 17 18:06:08 2019 +0900 @@ -24,9 +24,8 @@ ref_sharing::PySharedState, }; use hg::{ - DirsIterable, DirsMultiset, DirstateEntry, - DirstateMap as RustDirstateMap, DirstateParents, DirstateParseError, - EntryState, + DirsIterable, DirsMultiset, DirstateEntry, DirstateMap as RustDirstateMap, + DirstateParents, DirstateParseError, EntryState, PARENT_SIZE, }; // TODO @@ -239,9 +238,8 @@ } def setparents(&self, p1: PyObject, p2: PyObject) -> PyResult { - // TODO: don't panic; raise Python exception instead. - let p1 = p1.extract::(py)?.data(py).try_into().unwrap(); - let p2 = p2.extract::(py)?.data(py).try_into().unwrap(); + let p1 = extract_node_id(py, &p1)?; + let p2 = extract_node_id(py, &p2)?; self.inner(py) .borrow_mut() @@ -275,9 +273,8 @@ ) -> PyResult { let now = Duration::new(now.extract(py)?, 0); let parents = DirstateParents { - // TODO: don't panic; raise Python exception instead. - p1: p1.extract::(py)?.data(py).try_into().unwrap(), - p2: p2.extract::(py)?.data(py).try_into().unwrap(), + p1: extract_node_id(py, &p1)?, + p2: extract_node_id(py, &p2)?, }; match self.borrow_mut(py)?.pack(parents, now) { @@ -508,3 +505,11 @@ DirstateMap::translate_key_value, Option<(PyBytes, PyObject)> ); + +fn extract_node_id(py: Python, obj: &PyObject) -> PyResult<[u8; PARENT_SIZE]> { + let bytes = obj.extract::(py)?; + match bytes.data(py).try_into() { + Ok(s) => Ok(s), + Err(e) => Err(PyErr::new::(py, e.to_string())), + } +}