rust/hg-cpython/src/parsers.rs
changeset 45357 27424779c5b8
parent 44973 26114bd6ec60
child 45610 496537c9c1b4
equal deleted inserted replaced
45356:f025b97f3758 45357:27424779c5b8
    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                 )?;