Mercurial > public > mercurial-scm > hg
diff rust/hg-cpython/src/dirstate/dirstate_map.rs @ 45610:496537c9c1b4
rust: start plugging the dirstate tree behind a feature gate
The previous patch added the `dirstate-tree` feature gate to enable the two
dirstate implementations to co-habit while the tree-based one gets better.
This patch copies over the code that differs, be it because the algorithm
changed or because the borrowing rules are different.
Indeed, `DirstateTree` is not observationally equivalent to the std `HashMap` in
the APIs we use: it does not have the `Entry` API (yet?) and its iterator
returns owned values instead of references. This last point is because the
implementation needs to be changed to a more clever and efficient solution.
Differential Revision: https://phab.mercurial-scm.org/D9133
author | Rapha?l Gom?s <rgomes@octobus.net> |
---|---|
date | Wed, 30 Sep 2020 18:10:29 +0200 |
parents | 26114bd6ec60 |
children | 5bae4bc9bd42 |
line wrap: on
line diff
--- a/rust/hg-cpython/src/dirstate/dirstate_map.rs Wed Sep 30 18:10:53 2020 +0200 +++ b/rust/hg-cpython/src/dirstate/dirstate_map.rs Wed Sep 30 18:10:29 2020 +0200 @@ -142,10 +142,10 @@ })?, ) .and_then(|b| Ok(b.to_py_object(py))) - .or_else(|_| { + .or_else(|e| { Err(PyErr::new::<exc::OSError, _>( py, - "Dirstate error".to_string(), + format!("Dirstate error: {}", e.to_string()), )) }) } @@ -549,12 +549,14 @@ ) -> Ref<'a, RustDirstateMap> { self.inner(py).borrow() } + #[cfg(not(feature = "dirstate-tree"))] fn translate_key( py: Python, res: (&HgPathBuf, &DirstateEntry), ) -> PyResult<Option<PyBytes>> { Ok(Some(PyBytes::new(py, res.0.as_bytes()))) } + #[cfg(not(feature = "dirstate-tree"))] fn translate_key_value( py: Python, res: (&HgPathBuf, &DirstateEntry), @@ -562,7 +564,25 @@ let (f, entry) = res; Ok(Some(( PyBytes::new(py, f.as_bytes()), - make_dirstate_tuple(py, entry)?, + make_dirstate_tuple(py, &entry)?, + ))) + } + #[cfg(feature = "dirstate-tree")] + fn translate_key( + py: Python, + res: (HgPathBuf, DirstateEntry), + ) -> PyResult<Option<PyBytes>> { + Ok(Some(PyBytes::new(py, res.0.as_bytes()))) + } + #[cfg(feature = "dirstate-tree")] + fn translate_key_value( + py: Python, + res: (HgPathBuf, DirstateEntry), + ) -> PyResult<Option<(PyBytes, PyObject)>> { + let (f, entry) = res; + Ok(Some(( + PyBytes::new(py, f.as_bytes()), + make_dirstate_tuple(py, &entry)?, ))) } }