21 dirstate::item::DirstateItem, |
21 dirstate::item::DirstateItem, |
22 pybytes_deref::PyBytesDeref, |
22 pybytes_deref::PyBytesDeref, |
23 }; |
23 }; |
24 use hg::{ |
24 use hg::{ |
25 dirstate::parsers::Timestamp, |
25 dirstate::parsers::Timestamp, |
|
26 dirstate::StateMapIter, |
26 dirstate_tree::dirstate_map::DirstateMap as TreeDirstateMap, |
27 dirstate_tree::dirstate_map::DirstateMap as TreeDirstateMap, |
27 dirstate_tree::dispatch::DirstateMapMethods, |
28 dirstate_tree::dispatch::DirstateMapMethods, |
28 dirstate_tree::on_disk::DirstateV2ParseError, |
29 dirstate_tree::on_disk::DirstateV2ParseError, |
29 dirstate_tree::owning::OwningDirstateMap, |
30 dirstate_tree::owning::OwningDirstateMap, |
30 revlog::Node, |
31 revlog::Node, |
31 utils::files::normalize_case, |
32 utils::files::normalize_case, |
32 utils::hg_path::{HgPath, HgPathBuf}, |
33 utils::hg_path::{HgPath, HgPathBuf}, |
33 DirstateEntry, DirstateError, DirstateMap as RustDirstateMap, |
34 DirstateEntry, DirstateError, DirstateParents, EntryState, |
34 DirstateParents, EntryState, StateMapIter, |
|
35 }; |
35 }; |
36 |
36 |
37 // TODO |
37 // TODO |
38 // This object needs to share references to multiple members of its Rust |
38 // This object needs to share references to multiple members of its Rust |
39 // inner struct, namely `copy_map`, `dirs` and `all_dirs`. |
39 // inner struct, namely `copy_map`, `dirs` and `all_dirs`. |
50 @shared data inner: Box<dyn DirstateMapMethods + Send>; |
50 @shared data inner: Box<dyn DirstateMapMethods + Send>; |
51 |
51 |
52 /// Returns a `(dirstate_map, parents)` tuple |
52 /// Returns a `(dirstate_map, parents)` tuple |
53 @staticmethod |
53 @staticmethod |
54 def new_v1( |
54 def new_v1( |
55 use_dirstate_tree: bool, |
|
56 on_disk: PyBytes, |
55 on_disk: PyBytes, |
57 ) -> PyResult<PyObject> { |
56 ) -> PyResult<PyObject> { |
58 let (inner, parents) = if use_dirstate_tree { |
57 let on_disk = PyBytesDeref::new(py, on_disk); |
59 let on_disk = PyBytesDeref::new(py, on_disk); |
58 let mut map = OwningDirstateMap::new_empty(on_disk); |
60 let mut map = OwningDirstateMap::new_empty(on_disk); |
59 let (on_disk, map_placeholder) = map.get_mut_pair(); |
61 let (on_disk, map_placeholder) = map.get_mut_pair(); |
60 |
62 |
61 let (actual_map, parents) = TreeDirstateMap::new_v1(on_disk) |
63 let (actual_map, parents) = TreeDirstateMap::new_v1(on_disk) |
62 .map_err(|e| dirstate_error(py, e))?; |
64 .map_err(|e| dirstate_error(py, e))?; |
63 *map_placeholder = actual_map; |
65 *map_placeholder = actual_map; |
64 let map = Self::create_instance(py, Box::new(map))?; |
66 (Box::new(map) as _, parents) |
|
67 } else { |
|
68 let bytes = on_disk.data(py); |
|
69 let mut map = RustDirstateMap::default(); |
|
70 let parents = map.read(bytes).map_err(|e| dirstate_error(py, e))?; |
|
71 (Box::new(map) as _, parents) |
|
72 }; |
|
73 let map = Self::create_instance(py, inner)?; |
|
74 let parents = parents.map(|p| { |
65 let parents = parents.map(|p| { |
75 let p1 = PyBytes::new(py, p.p1.as_bytes()); |
66 let p1 = PyBytes::new(py, p.p1.as_bytes()); |
76 let p2 = PyBytes::new(py, p.p2.as_bytes()); |
67 let p2 = PyBytes::new(py, p.p2.as_bytes()); |
77 (p1, p2) |
68 (p1, p2) |
78 }); |
69 }); |