changeset 42957 | 7a01778bc7b7 |
parent 42802 | 2e1f74cc3350 |
child 43208 | 1ca3823aeefd |
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, ©_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, |