Mercurial > hg
view rust/hg-cpython/src/dirstate/copymap.rs @ 46334:4b0192f592cf
share: move share safe functionality out of experimental
The share-safe functionality is complete and all configuration options are
implemented. The behavior is well discussed on mailing list and in reviews.
Let's unmark this as experimental to solve a chichen and egg issue.
Differential Revision: https://phab.mercurial-scm.org/D9823
author | Pulkit Goyal <7895pulkit@gmail.com> |
---|---|
date | Mon, 18 Jan 2021 19:16:49 +0530 |
parents | 26114bd6ec60 |
children | cd8ca38fccff |
line wrap: on
line source
// copymap.rs // // Copyright 2019 Raphaël Gomès <rgomes@octobus.net> // // This software may be used and distributed according to the terms of the // GNU General Public License version 2 or any later version. //! Bindings for `hg::dirstate::dirstate_map::CopyMap` provided by the //! `hg-core` package. use cpython::{ PyBytes, PyClone, PyDict, PyObject, PyResult, Python, UnsafePyLeaked, }; use std::cell::RefCell; use crate::dirstate::dirstate_map::DirstateMap; use hg::{utils::hg_path::HgPathBuf, CopyMapIter}; py_class!(pub class CopyMap |py| { data dirstate_map: DirstateMap; def __getitem__(&self, key: PyObject) -> PyResult<PyBytes> { (*self.dirstate_map(py)).copymapgetitem(py, key) } def __len__(&self) -> PyResult<usize> { self.dirstate_map(py).copymaplen(py) } def __contains__(&self, key: PyObject) -> PyResult<bool> { self.dirstate_map(py).copymapcontains(py, key) } def get( &self, key: PyObject, default: Option<PyObject> = None ) -> PyResult<Option<PyObject>> { self.dirstate_map(py).copymapget(py, key, default) } def pop( &self, key: PyObject, default: Option<PyObject> = None ) -> PyResult<Option<PyObject>> { self.dirstate_map(py).copymappop(py, key, default) } def __iter__(&self) -> PyResult<CopyMapKeysIterator> { self.dirstate_map(py).copymapiter(py) } // Python's `dict()` builtin works with either a subclass of dict // or an abstract mapping. Said mapping needs to implement `__getitem__` // and `keys`. def keys(&self) -> PyResult<CopyMapKeysIterator> { self.dirstate_map(py).copymapiter(py) } def items(&self) -> PyResult<CopyMapItemsIterator> { self.dirstate_map(py).copymapitemsiter(py) } def iteritems(&self) -> PyResult<CopyMapItemsIterator> { self.dirstate_map(py).copymapitemsiter(py) } def __setitem__( &self, key: PyObject, item: PyObject ) -> PyResult<()> { self.dirstate_map(py).copymapsetitem(py, key, item)?; Ok(()) } def copy(&self) -> PyResult<PyDict> { self.dirstate_map(py).copymapcopy(py) } }); impl CopyMap { pub fn from_inner(py: Python, dm: DirstateMap) -> PyResult<Self> { Self::create_instance(py, dm) } fn translate_key( py: Python, res: (&HgPathBuf, &HgPathBuf), ) -> PyResult<Option<PyBytes>> { Ok(Some(PyBytes::new(py, res.0.as_bytes()))) } fn translate_key_value( py: Python, res: (&HgPathBuf, &HgPathBuf), ) -> PyResult<Option<(PyBytes, PyBytes)>> { let (k, v) = res; Ok(Some(( PyBytes::new(py, k.as_bytes()), PyBytes::new(py, v.as_bytes()), ))) } } py_shared_iterator!( CopyMapKeysIterator, UnsafePyLeaked<CopyMapIter<'static>>, CopyMap::translate_key, Option<PyBytes> ); py_shared_iterator!( CopyMapItemsIterator, UnsafePyLeaked<CopyMapIter<'static>>, CopyMap::translate_key_value, Option<(PyBytes, PyBytes)> );