968 &self, |
968 &self, |
969 py: Python, |
969 py: Python, |
970 py_roots: PyDict, |
970 py_roots: PyDict, |
971 ) -> PyResult<PyObject> { |
971 ) -> PyResult<PyObject> { |
972 let index = &*self.index(py).borrow(); |
972 let index = &*self.index(py).borrow(); |
973 let opt = self.get_nodetree(py)?.borrow(); |
|
974 let nt = opt.as_ref().unwrap(); |
|
975 let roots: Result<HashMap<Phase, Vec<Revision>>, PyErr> = py_roots |
973 let roots: Result<HashMap<Phase, Vec<Revision>>, PyErr> = py_roots |
976 .items_list(py) |
974 .items_list(py) |
977 .iter(py) |
975 .iter(py) |
978 .map(|r| { |
976 .map(|r| { |
979 let phase = r.get_item(py, 0)?; |
977 let phase = r.get_item(py, 0)?; |
980 let nodes = r.get_item(py, 1)?; |
978 let revs: Vec<_> = |
981 // Transform the nodes from Python to revs here since we |
979 rev_pyiter_collect(py, &r.get_item(py, 1)?, index)?; |
982 // have access to the nodemap |
|
983 let revs: Result<_, _> = nodes |
|
984 .iter(py)? |
|
985 .map(|node| match node?.extract::<PyBytes>(py) { |
|
986 Ok(py_bytes) => { |
|
987 let node = node_from_py_bytes(py, &py_bytes)?; |
|
988 nt.find_bin(index, node.into()) |
|
989 .map_err(|e| nodemap_error(py, e))? |
|
990 .ok_or_else(|| revlog_error(py)) |
|
991 } |
|
992 Err(e) => Err(e), |
|
993 }) |
|
994 .collect(); |
|
995 let phase = Phase::try_from(phase.extract::<usize>(py)?) |
980 let phase = Phase::try_from(phase.extract::<usize>(py)?) |
996 .map_err(|_| revlog_error(py)); |
981 .map_err(|_| revlog_error(py)); |
997 Ok((phase?, revs?)) |
982 Ok((phase?, revs)) |
998 }) |
983 }) |
999 .collect(); |
984 .collect(); |
1000 let (len, phase_maps) = index |
985 let (len, phase_maps) = index |
1001 .compute_phases_map_sets(roots?) |
986 .compute_phases_map_sets(roots?) |
1002 .map_err(|e| graph_error(py, e))?; |
987 .map_err(|e| graph_error(py, e))?; |