rust/hg-cpython/src/parsers.rs
changeset 42957 7a01778bc7b7
parent 42802 2e1f74cc3350
child 43208 1ca3823aeefd
equal deleted inserted replaced
42956:3fe40dd6355d 42957:7a01778bc7b7
    13 use cpython::{
    13 use cpython::{
    14     exc, PyBytes, PyDict, PyErr, PyInt, PyModule, PyResult, PyTuple, Python,
    14     exc, PyBytes, PyDict, PyErr, PyInt, PyModule, PyResult, PyTuple, Python,
    15     PythonObject, ToPyObject,
    15     PythonObject, ToPyObject,
    16 };
    16 };
    17 use hg::{
    17 use hg::{
    18     pack_dirstate, parse_dirstate, DirstateEntry, DirstatePackError,
    18     pack_dirstate, parse_dirstate, utils::hg_path::HgPathBuf, DirstateEntry,
    19     DirstateParents, DirstateParseError, PARENT_SIZE,
    19     DirstatePackError, DirstateParents, DirstateParseError, PARENT_SIZE,
    20 };
    20 };
    21 use std::collections::HashMap;
    21 use std::collections::HashMap;
    22 use std::convert::TryInto;
    22 use std::convert::TryInto;
    23 
    23 
    24 use libc::c_char;
    24 use libc::c_char;
    44                 // cast.
    44                 // cast.
    45                 let state: u8 = entry.state.into();
    45                 let state: u8 = entry.state.into();
    46 
    46 
    47                 dmap.set_item(
    47                 dmap.set_item(
    48                     py,
    48                     py,
    49                     PyBytes::new(py, &filename),
    49                     PyBytes::new(py, filename.as_ref()),
    50                     decapsule_make_dirstate_tuple(py)?(
    50                     decapsule_make_dirstate_tuple(py)?(
    51                         state as c_char,
    51                         state as c_char,
    52                         entry.mode,
    52                         entry.mode,
    53                         entry.size,
    53                         entry.size,
    54                         entry.mtime,
    54                         entry.mtime,
    56                 )?;
    56                 )?;
    57             }
    57             }
    58             for (path, copy_path) in copies {
    58             for (path, copy_path) in copies {
    59                 copymap.set_item(
    59                 copymap.set_item(
    60                     py,
    60                     py,
    61                     PyBytes::new(py, &path),
    61                     PyBytes::new(py, path.as_ref()),
    62                     PyBytes::new(py, &copy_path),
    62                     PyBytes::new(py, copy_path.as_ref()),
    63                 )?;
    63                 )?;
    64             }
    64             }
    65             Ok(
    65             Ok(
    66                 (PyBytes::new(py, &parents.p1), PyBytes::new(py, &parents.p2))
    66                 (PyBytes::new(py, &parents.p1), PyBytes::new(py, &parents.p2))
    67                     .to_py_object(py),
    67                     .to_py_object(py),
    97     let p2 = pl.get_item(py, 1).extract::<PyBytes>(py)?;
    97     let p2 = pl.get_item(py, 1).extract::<PyBytes>(py)?;
    98     let p2: &[u8] = p2.data(py);
    98     let p2: &[u8] = p2.data(py);
    99 
    99 
   100     let mut dirstate_map = extract_dirstate(py, &dmap)?;
   100     let mut dirstate_map = extract_dirstate(py, &dmap)?;
   101 
   101 
   102     let copies: Result<HashMap<Vec<u8>, Vec<u8>>, PyErr> = copymap
   102     let copies: Result<HashMap<HgPathBuf, HgPathBuf>, PyErr> = copymap
   103         .items(py)
   103         .items(py)
   104         .iter()
   104         .iter()
   105         .map(|(key, value)| {
   105         .map(|(key, value)| {
   106             Ok((
   106             Ok((
   107                 key.extract::<PyBytes>(py)?.data(py).to_owned(),
   107                 HgPathBuf::from_bytes(key.extract::<PyBytes>(py)?.data(py)),
   108                 value.extract::<PyBytes>(py)?.data(py).to_owned(),
   108                 HgPathBuf::from_bytes(value.extract::<PyBytes>(py)?.data(py)),
   109             ))
   109             ))
   110         })
   110         })
   111         .collect();
   111         .collect();
   112 
   112 
   113     if p1.len() != PARENT_SIZE || p2.len() != PARENT_SIZE {
   113     if p1.len() != PARENT_SIZE || p2.len() != PARENT_SIZE {
   142                 // implementation while `as c_char` would just do a naive enum
   142                 // implementation while `as c_char` would just do a naive enum
   143                 // cast.
   143                 // cast.
   144                 let state: u8 = state.into();
   144                 let state: u8 = state.into();
   145                 dmap.set_item(
   145                 dmap.set_item(
   146                     py,
   146                     py,
   147                     PyBytes::new(py, &filename[..]),
   147                     PyBytes::new(py, filename.as_ref()),
   148                     decapsule_make_dirstate_tuple(py)?(
   148                     decapsule_make_dirstate_tuple(py)?(
   149                         state as c_char,
   149                         state as c_char,
   150                         mode,
   150                         mode,
   151                         size,
   151                         size,
   152                         mtime,
   152                         mtime,