diff --git a/rust/hg-cpython/src/dirstate.rs b/rust/hg-cpython/src/dirstate.rs --- a/rust/hg-cpython/src/dirstate.rs +++ b/rust/hg-cpython/src/dirstate.rs @@ -73,6 +73,19 @@ pub fn make_dirstate_item( maybe_obj.ok_or_else(|| PyErr::fetch(py)) } +// XXX a bit strange to have a dedicated function, but directory are not +// treated as dirstate node by hg-core for now so… +pub fn make_directory_item(py: Python, mtime: i32) -> PyResult { + // might be silly to retrieve capsule function in hot loop + let make = make_dirstate_item_capi::retrieve(py)?; + + let maybe_obj = unsafe { + let ptr = make(b'd' as c_char, 0 as i32, 0 as i32, mtime); + PyObject::from_owned_ptr_opt(py, ptr) + }; + maybe_obj.ok_or_else(|| PyErr::fetch(py)) +} + pub fn extract_dirstate(py: Python, dmap: &PyDict) -> Result { dmap.items(py) .iter() diff --git a/rust/hg-cpython/src/dirstate/dirstate_map.rs b/rust/hg-cpython/src/dirstate/dirstate_map.rs --- a/rust/hg-cpython/src/dirstate/dirstate_map.rs +++ b/rust/hg-cpython/src/dirstate/dirstate_map.rs @@ -19,6 +19,7 @@ use cpython::{ use crate::{ dirstate::copymap::{CopyMap, CopyMapItemsIterator, CopyMapKeysIterator}, + dirstate::make_directory_item, dirstate::make_dirstate_item, dirstate::non_normal_entries::{ NonNormalEntries, NonNormalEntriesIterator, @@ -519,7 +520,8 @@ py_class!(pub class DirstateMap |py| { let (path, mtime) = item.map_err(|e| v2_error(py, e))?; let path = PyBytes::new(py, path.as_bytes()); let mtime = mtime.map(|t| t.0).unwrap_or(-1); - let tuple = (path, (b'd', 0, 0, mtime)); + let item = make_directory_item(py, mtime as i32)?; + let tuple = (path, item); dirs.append(py, tuple.to_py_object(py).into_object()) } Ok(dirs)