rust/hg-cpython/src/dirstate/dirstate_map.rs
changeset 48068 bf8837e3d7ce
parent 48061 060cd909439f
child 48069 3d0a9c6e614d
equal deleted inserted replaced
48067:d3eb5f50052c 48068:bf8837e3d7ce
    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         });