12 use cpython::{ |
12 use cpython::{ |
13 exc, PyBytes, PyDict, PyErr, PyInt, PyModule, PyResult, PyTuple, Python, |
13 exc, PyBytes, PyDict, PyErr, PyInt, PyModule, PyResult, PyTuple, Python, |
14 PythonObject, ToPyObject, |
14 PythonObject, ToPyObject, |
15 }; |
15 }; |
16 use hg::{ |
16 use hg::{ |
17 pack_dirstate, parse_dirstate, utils::hg_path::HgPathBuf, |
17 pack_dirstate, parse_dirstate, utils::hg_path::HgPathBuf, DirstateEntry, |
18 DirstatePackError, DirstateParents, DirstateParseError, FastHashMap, |
18 DirstatePackError, DirstateParents, DirstateParseError, FastHashMap, |
19 PARENT_SIZE, |
19 PARENT_SIZE, |
20 }; |
20 }; |
21 use std::convert::TryInto; |
21 use std::convert::TryInto; |
22 |
22 |
27 py: Python, |
27 py: Python, |
28 dmap: PyDict, |
28 dmap: PyDict, |
29 copymap: PyDict, |
29 copymap: PyDict, |
30 st: PyBytes, |
30 st: PyBytes, |
31 ) -> PyResult<PyTuple> { |
31 ) -> PyResult<PyTuple> { |
32 let mut dirstate_map = FastHashMap::default(); |
32 match parse_dirstate(st.data(py)) { |
33 let mut copies = FastHashMap::default(); |
33 Ok((parents, entries, copies)) => { |
|
34 let dirstate_map: FastHashMap<HgPathBuf, DirstateEntry> = entries |
|
35 .into_iter() |
|
36 .map(|(path, entry)| (path.to_owned(), entry)) |
|
37 .collect(); |
|
38 let copy_map: FastHashMap<HgPathBuf, HgPathBuf> = copies |
|
39 .into_iter() |
|
40 .map(|(path, copy)| (path.to_owned(), copy.to_owned())) |
|
41 .collect(); |
34 |
42 |
35 match parse_dirstate(&mut dirstate_map, &mut copies, st.data(py)) { |
|
36 Ok(parents) => { |
|
37 for (filename, entry) in &dirstate_map { |
43 for (filename, entry) in &dirstate_map { |
38 dmap.set_item( |
44 dmap.set_item( |
39 py, |
45 py, |
40 PyBytes::new(py, filename.as_bytes()), |
46 PyBytes::new(py, filename.as_bytes()), |
41 make_dirstate_tuple(py, entry)?, |
47 make_dirstate_tuple(py, entry)?, |
42 )?; |
48 )?; |
43 } |
49 } |
44 for (path, copy_path) in copies { |
50 for (path, copy_path) in copy_map { |
45 copymap.set_item( |
51 copymap.set_item( |
46 py, |
52 py, |
47 PyBytes::new(py, path.as_bytes()), |
53 PyBytes::new(py, path.as_bytes()), |
48 PyBytes::new(py, copy_path.as_bytes()), |
54 PyBytes::new(py, copy_path.as_bytes()), |
49 )?; |
55 )?; |