14 |
14 |
15 use cpython::{ |
15 use cpython::{ |
16 exc, ObjectProtocol, PyBool, PyBytes, PyClone, PyDict, PyErr, PyObject, |
16 exc, ObjectProtocol, PyBool, PyBytes, PyClone, PyDict, PyErr, PyObject, |
17 PyResult, PyTuple, Python, PythonObject, ToPyObject, |
17 PyResult, PyTuple, Python, PythonObject, ToPyObject, |
18 }; |
18 }; |
19 use libc::c_char; |
|
20 |
19 |
21 use crate::{ |
20 use crate::{ |
22 dirstate::copymap::{CopyMap, CopyMapItemsIterator, CopyMapKeysIterator}, |
21 dirstate::copymap::{CopyMap, CopyMapItemsIterator, CopyMapKeysIterator}, |
23 dirstate::{decapsule_make_dirstate_tuple, dirs_multiset::Dirs}, |
22 dirstate::{dirs_multiset::Dirs, make_dirstate_tuple}, |
24 ref_sharing::{PyLeakedRef, PySharedRefCell}, |
23 ref_sharing::{PyLeakedRef, PySharedRefCell}, |
25 }; |
24 }; |
26 use hg::{ |
25 use hg::{ |
27 utils::hg_path::{HgPath, HgPathBuf}, |
26 utils::hg_path::{HgPath, HgPathBuf}, |
28 DirsMultiset, DirstateEntry, DirstateMap as RustDirstateMap, |
27 DirsMultiset, DirstateEntry, DirstateMap as RustDirstateMap, |
64 default: Option<PyObject> = None |
63 default: Option<PyObject> = None |
65 ) -> PyResult<Option<PyObject>> { |
64 ) -> PyResult<Option<PyObject>> { |
66 let key = key.extract::<PyBytes>(py)?; |
65 let key = key.extract::<PyBytes>(py)?; |
67 match self.inner(py).borrow().get(HgPath::new(key.data(py))) { |
66 match self.inner(py).borrow().get(HgPath::new(key.data(py))) { |
68 Some(entry) => { |
67 Some(entry) => { |
69 // Explicitly go through u8 first, then cast to |
68 Ok(Some(make_dirstate_tuple(py, entry)?)) |
70 // platform-specific `c_char`. |
|
71 let state: u8 = entry.state.into(); |
|
72 Ok(Some(decapsule_make_dirstate_tuple(py)?( |
|
73 state as c_char, |
|
74 entry.mode, |
|
75 entry.size, |
|
76 entry.mtime, |
|
77 ))) |
|
78 }, |
69 }, |
79 None => Ok(default) |
70 None => Ok(default) |
80 } |
71 } |
81 } |
72 } |
82 |
73 |
301 def __getitem__(&self, key: PyObject) -> PyResult<PyObject> { |
292 def __getitem__(&self, key: PyObject) -> PyResult<PyObject> { |
302 let key = key.extract::<PyBytes>(py)?; |
293 let key = key.extract::<PyBytes>(py)?; |
303 let key = HgPath::new(key.data(py)); |
294 let key = HgPath::new(key.data(py)); |
304 match self.inner(py).borrow().get(key) { |
295 match self.inner(py).borrow().get(key) { |
305 Some(entry) => { |
296 Some(entry) => { |
306 // Explicitly go through u8 first, then cast to |
297 Ok(make_dirstate_tuple(py, entry)?) |
307 // platform-specific `c_char`. |
|
308 let state: u8 = entry.state.into(); |
|
309 Ok(decapsule_make_dirstate_tuple(py)?( |
|
310 state as c_char, |
|
311 entry.mode, |
|
312 entry.size, |
|
313 entry.mtime, |
|
314 )) |
|
315 }, |
298 }, |
316 None => Err(PyErr::new::<exc::KeyError, _>( |
299 None => Err(PyErr::new::<exc::KeyError, _>( |
317 py, |
300 py, |
318 String::from_utf8_lossy(key.as_bytes()), |
301 String::from_utf8_lossy(key.as_bytes()), |
319 )), |
302 )), |
491 fn translate_key_value( |
474 fn translate_key_value( |
492 py: Python, |
475 py: Python, |
493 res: (&HgPathBuf, &DirstateEntry), |
476 res: (&HgPathBuf, &DirstateEntry), |
494 ) -> PyResult<Option<(PyBytes, PyObject)>> { |
477 ) -> PyResult<Option<(PyBytes, PyObject)>> { |
495 let (f, entry) = res; |
478 let (f, entry) = res; |
496 |
|
497 // Explicitly go through u8 first, then cast to |
|
498 // platform-specific `c_char`. |
|
499 let state: u8 = entry.state.into(); |
|
500 Ok(Some(( |
479 Ok(Some(( |
501 PyBytes::new(py, f.as_ref()), |
480 PyBytes::new(py, f.as_ref()), |
502 decapsule_make_dirstate_tuple(py)?( |
481 make_dirstate_tuple(py, entry)?, |
503 state as c_char, |
|
504 entry.mode, |
|
505 entry.size, |
|
506 entry.mtime, |
|
507 ), |
|
508 ))) |
482 ))) |
509 } |
483 } |
510 } |
484 } |
511 |
485 |
512 py_shared_ref!(DirstateMap, RustDirstateMap, inner, inner_shared); |
486 py_shared_ref!(DirstateMap, RustDirstateMap, inner, inner_shared); |