##// END OF EJS Templates
errors: use InputError in uncommit extension...
errors: use InputError in uncommit extension Differential Revision: https://phab.mercurial-scm.org/D9911

File last commit:

r47169:776b9717 default
r47192:0e2becd1 default
Show More
dirstate_map.rs
610 lines | 18.9 KiB | application/rls-services+xml | RustLexer
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 // dirstate_map.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 the `hg::dirstate::dirstate_map` file provided by the
//! `hg-core` package.
Raphaël Gomès
rust-dirstate-status: rust-cpython bindings for `dirstate.status`...
r43567 use std::cell::{Ref, RefCell};
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 use std::convert::TryInto;
use std::time::Duration;
use cpython::{
Raphaël Gomès
rust-dirstatemap: add `NonNormalEntries` class...
r44836 exc, ObjectProtocol, PyBool, PyBytes, PyClone, PyDict, PyErr, PyList,
PyObject, PyResult, PyString, PyTuple, Python, PythonObject, ToPyObject,
Raphaël Gomès
rust-dirstatemap: add `NonNormalEntries` class...
r44779 UnsafePyLeaked,
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 };
use crate::{
dirstate::copymap::{CopyMap, CopyMapItemsIterator, CopyMapKeysIterator},
Raphaël Gomès
rust-cpython: make `NonNormalEntires` iterable to fix `fsmonitor` (issue6276)...
r44903 dirstate::non_normal_entries::{
NonNormalEntries, NonNormalEntriesIterator,
},
Yuya Nishihara
rust-cpython: add wrapper around decapsule_make_dirstate_tuple()...
r43479 dirstate::{dirs_multiset::Dirs, make_dirstate_tuple},
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 };
use hg::{
Simon Sapin
rust: Remove DirstateParseError and ListDirstateTrackedFilesError...
r47169 errors::HgError,
Raphaël Gomès
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf...
r43227 utils::hg_path::{HgPath, HgPathBuf},
Yuya Nishihara
rust-dirstate: split DirsMultiset constructor per input type...
r43070 DirsMultiset, DirstateEntry, DirstateMap as RustDirstateMap,
Simon Sapin
rust: Remove DirstateParseError and ListDirstateTrackedFilesError...
r47169 DirstateMapError, DirstateParents, EntryState, StateMapIter, PARENT_SIZE,
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 };
// TODO
// This object needs to share references to multiple members of its Rust
// inner struct, namely `copy_map`, `dirs` and `all_dirs`.
// Right now `CopyMap` is done, but it needs to have an explicit reference
// to `RustDirstateMap` which itself needs to have an encapsulation for
// every method in `CopyMap` (copymapcopy, etc.).
// This is ugly and hard to maintain.
// The same logic applies to `dirs` and `all_dirs`, however the `Dirs`
// `py_class!` is already implemented and does not mention
// `RustDirstateMap`, rightfully so.
// All attributes also have to have a separate refcount data attribute for
// leaks, with all methods that go along for reference sharing.
py_class!(pub class DirstateMap |py| {
Yuya Nishihara
rust-cpython: switch to upstreamed version of PySharedRefCell...
r44703 @shared data inner: RustDirstateMap;
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999
def __new__(_cls, _root: PyObject) -> PyResult<Self> {
let inner = RustDirstateMap::default();
Yuya Nishihara
rust-cpython: switch to upstreamed version of PySharedRefCell...
r44703 Self::create_instance(py, inner)
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 }
def clear(&self) -> PyResult<PyObject> {
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 self.inner(py).borrow_mut().clear();
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 Ok(py.None())
}
def get(
&self,
key: PyObject,
default: Option<PyObject> = None
) -> PyResult<Option<PyObject>> {
let key = key.extract::<PyBytes>(py)?;
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 match self.inner(py).borrow().get(HgPath::new(key.data(py))) {
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 Some(entry) => {
Yuya Nishihara
rust-cpython: add wrapper around decapsule_make_dirstate_tuple()...
r43479 Ok(Some(make_dirstate_tuple(py, entry)?))
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 },
None => Ok(default)
}
}
def addfile(
&self,
f: PyObject,
oldstate: PyObject,
state: PyObject,
mode: PyObject,
size: PyObject,
mtime: PyObject
) -> PyResult<PyObject> {
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 self.inner(py).borrow_mut().add_file(
Raphaël Gomès
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf...
r43227 HgPath::new(f.extract::<PyBytes>(py)?.data(py)),
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 oldstate.extract::<PyBytes>(py)?.data(py)[0]
.try_into()
Simon Sapin
rust: Remove DirstateParseError and ListDirstateTrackedFilesError...
r47169 .map_err(|e: HgError| {
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 PyErr::new::<exc::ValueError, _>(py, e.to_string())
})?,
DirstateEntry {
state: state.extract::<PyBytes>(py)?.data(py)[0]
.try_into()
Simon Sapin
rust: Remove DirstateParseError and ListDirstateTrackedFilesError...
r47169 .map_err(|e: HgError| {
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 PyErr::new::<exc::ValueError, _>(py, e.to_string())
})?,
mode: mode.extract(py)?,
size: size.extract(py)?,
mtime: mtime.extract(py)?,
},
Raphaël Gomès
rust-dirs: address failing tests for `dirs` impl with a temporary fix...
r44227 ).and(Ok(py.None())).or_else(|e: DirstateMapError| {
Err(PyErr::new::<exc::ValueError, _>(py, e.to_string()))
})
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 }
def removefile(
&self,
f: PyObject,
oldstate: PyObject,
size: PyObject
) -> PyResult<PyObject> {
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 self.inner(py).borrow_mut()
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 .remove_file(
Raphaël Gomès
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf...
r43227 HgPath::new(f.extract::<PyBytes>(py)?.data(py)),
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 oldstate.extract::<PyBytes>(py)?.data(py)[0]
.try_into()
Simon Sapin
rust: Remove DirstateParseError and ListDirstateTrackedFilesError...
r47169 .map_err(|e: HgError| {
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 PyErr::new::<exc::ValueError, _>(py, e.to_string())
})?,
size.extract(py)?,
)
.or_else(|_| {
Err(PyErr::new::<exc::OSError, _>(
py,
"Dirstate error".to_string(),
))
})?;
Ok(py.None())
}
def dropfile(
&self,
f: PyObject,
oldstate: PyObject
) -> PyResult<PyBool> {
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 self.inner(py).borrow_mut()
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 .drop_file(
Raphaël Gomès
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf...
r43227 HgPath::new(f.extract::<PyBytes>(py)?.data(py)),
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 oldstate.extract::<PyBytes>(py)?.data(py)[0]
.try_into()
Simon Sapin
rust: Remove DirstateParseError and ListDirstateTrackedFilesError...
r47169 .map_err(|e: HgError| {
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 PyErr::new::<exc::ValueError, _>(py, e.to_string())
})?,
)
.and_then(|b| Ok(b.to_py_object(py)))
Raphaël Gomès
rust: start plugging the dirstate tree behind a feature gate...
r46185 .or_else(|e| {
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 Err(PyErr::new::<exc::OSError, _>(
py,
Raphaël Gomès
rust: start plugging the dirstate tree behind a feature gate...
r46185 format!("Dirstate error: {}", e.to_string()),
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 ))
})
}
def clearambiguoustimes(
&self,
files: PyObject,
now: PyObject
) -> PyResult<PyObject> {
Raphaël Gomès
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf...
r43227 let files: PyResult<Vec<HgPathBuf>> = files
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 .iter(py)?
.map(|filename| {
Raphaël Gomès
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf...
r43227 Ok(HgPathBuf::from_bytes(
filename?.extract::<PyBytes>(py)?.data(py),
))
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 })
.collect();
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 self.inner(py).borrow_mut()
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 .clear_ambiguous_times(files?, now.extract(py)?);
Ok(py.None())
}
Raphaël Gomès
rust-dirstatemap: add `NonNormalEntries` class...
r44836 def other_parent_entries(&self) -> PyResult<PyObject> {
Raphaël Gomès
rust-dirstatemap: add `NonNormalEntries` class...
r44779 let mut inner_shared = self.inner(py).borrow_mut();
Raphaël Gomès
rust-dirstatemap: add `NonNormalEntries` class...
r44836 let (_, other_parent) =
inner_shared.get_non_normal_other_parent_entries();
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999
let locals = PyDict::new(py);
locals.set_item(
py,
"other_parent",
Raphaël Gomès
rust-dirstatemap: directly return `non_normal` and `other_entries`...
r44842 other_parent
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 .iter()
Raphaël Gomès
rust: do a clippy pass...
r45500 .map(|v| PyBytes::new(py, v.as_bytes()))
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 .collect::<Vec<PyBytes>>()
.to_py_object(py),
)?;
Raphaël Gomès
rust-dirstatemap: add `NonNormalEntries` class...
r44836 py.eval("set(other_parent)", None, Some(&locals))
}
def non_normal_entries(&self) -> PyResult<NonNormalEntries> {
NonNormalEntries::from_inner(py, self.clone_ref(py))
}
def non_normal_entries_contains(&self, key: PyObject) -> PyResult<bool> {
let key = key.extract::<PyBytes>(py)?;
Ok(self
Raphaël Gomès
rust-dirstatemap: add `NonNormalEntries` class...
r44779 .inner(py)
.borrow_mut()
Raphaël Gomès
rust-dirstatemap: add `NonNormalEntries` class...
r44836 .get_non_normal_other_parent_entries().0
.contains(HgPath::new(key.data(py))))
}
def non_normal_entries_display(&self) -> PyResult<PyString> {
Ok(
PyString::new(
py,
&format!(
"NonNormalEntries: {:?}",
self
Raphaël Gomès
rust-dirstatemap: add `NonNormalEntries` class...
r44779 .inner(py)
.borrow_mut()
Raphaël Gomès
rust-dirstatemap: add `NonNormalEntries` class...
r44836 .get_non_normal_other_parent_entries().0
Raphaël Gomès
rust-dirstatemap: directly return `non_normal` and `other_entries`...
r44842 .iter().map(|o| o))
Raphaël Gomès
rust-dirstatemap: add `NonNormalEntries` class...
r44836 )
)
}
def non_normal_entries_remove(&self, key: PyObject) -> PyResult<PyObject> {
let key = key.extract::<PyBytes>(py)?;
self
Raphaël Gomès
rust-dirstatemap: add `NonNormalEntries` class...
r44779 .inner(py)
.borrow_mut()
Raphaël Gomès
rust-dirstatemap: add `NonNormalEntries` class...
r44836 .non_normal_entries_remove(HgPath::new(key.data(py)));
Ok(py.None())
}
def non_normal_entries_union(&self, other: PyObject) -> PyResult<PyList> {
let other: PyResult<_> = other.iter(py)?
.map(|f| {
Ok(HgPathBuf::from_bytes(
f?.extract::<PyBytes>(py)?.data(py),
))
})
.collect();
let res = self
Raphaël Gomès
rust-dirstatemap: add `NonNormalEntries` class...
r44779 .inner(py)
.borrow_mut()
Raphaël Gomès
rust-dirstatemap: add `NonNormalEntries` class...
r44836 .non_normal_entries_union(other?);
let ret = PyList::new(py, &[]);
Raphaël Gomès
rust-dirstatemap: add `NonNormalEntries` class...
r44779 for filename in res.iter() {
Raphaël Gomès
rust-dirstatemap: add `NonNormalEntries` class...
r44836 let as_pystring = PyBytes::new(py, filename.as_bytes());
Raphaël Gomès
rust-dirstatemap: add `NonNormalEntries` class...
r44779 ret.append(py, as_pystring.into_object());
Raphaël Gomès
rust-dirstatemap: add `NonNormalEntries` class...
r44836 }
Ok(ret)
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 }
Raphaël Gomès
rust-cpython: make `NonNormalEntires` iterable to fix `fsmonitor` (issue6276)...
r44903 def non_normal_entries_iter(&self) -> PyResult<NonNormalEntriesIterator> {
// Make sure the sets are defined before we no longer have a mutable
// reference to the dmap.
self.inner(py)
.borrow_mut()
.set_non_normal_other_parent_entries(false);
let leaked_ref = self.inner(py).leak_immutable();
NonNormalEntriesIterator::from_inner(py, unsafe {
leaked_ref.map(py, |o| {
o.get_non_normal_other_parent_entries_panic().0.iter()
})
})
}
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 def hastrackeddir(&self, d: PyObject) -> PyResult<PyBool> {
let d = d.extract::<PyBytes>(py)?;
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 Ok(self.inner(py).borrow_mut()
Raphaël Gomès
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf...
r43227 .has_tracked_dir(HgPath::new(d.data(py)))
Raphaël Gomès
rust-dirs: handle forgotten `Result`s...
r44315 .map_err(|e| {
PyErr::new::<exc::ValueError, _>(py, e.to_string())
})?
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 .to_py_object(py))
}
def hasdir(&self, d: PyObject) -> PyResult<PyBool> {
let d = d.extract::<PyBytes>(py)?;
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 Ok(self.inner(py).borrow_mut()
Raphaël Gomès
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf...
r43227 .has_dir(HgPath::new(d.data(py)))
Raphaël Gomès
rust-dirs: handle forgotten `Result`s...
r44315 .map_err(|e| {
PyErr::new::<exc::ValueError, _>(py, e.to_string())
})?
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 .to_py_object(py))
}
def parents(&self, st: PyObject) -> PyResult<PyTuple> {
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 self.inner(py).borrow_mut()
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 .parents(st.extract::<PyBytes>(py)?.data(py))
.and_then(|d| {
Ok((PyBytes::new(py, &d.p1), PyBytes::new(py, &d.p2))
.to_py_object(py))
})
.or_else(|_| {
Err(PyErr::new::<exc::OSError, _>(
py,
"Dirstate error".to_string(),
))
})
}
def setparents(&self, p1: PyObject, p2: PyObject) -> PyResult<PyObject> {
Yuya Nishihara
rust-dirstate: handle invalid length of p1/p2 parameters...
r43068 let p1 = extract_node_id(py, &p1)?;
let p2 = extract_node_id(py, &p2)?;
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 self.inner(py).borrow_mut()
Yuya Nishihara
rust-dirstate: remove excessive clone() of parameter and return value...
r43069 .set_parents(&DirstateParents { p1, p2 });
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 Ok(py.None())
}
def read(&self, st: PyObject) -> PyResult<Option<PyObject>> {
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 match self.inner(py).borrow_mut()
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 .read(st.extract::<PyBytes>(py)?.data(py))
{
Ok(Some(parents)) => Ok(Some(
(PyBytes::new(py, &parents.p1), PyBytes::new(py, &parents.p2))
.to_py_object(py)
.into_object(),
)),
Ok(None) => Ok(Some(py.None())),
Err(_) => Err(PyErr::new::<exc::OSError, _>(
py,
"Dirstate error".to_string(),
)),
}
}
def write(
&self,
p1: PyObject,
p2: PyObject,
now: PyObject
) -> PyResult<PyBytes> {
let now = Duration::new(now.extract(py)?, 0);
let parents = DirstateParents {
Yuya Nishihara
rust-dirstate: handle invalid length of p1/p2 parameters...
r43068 p1: extract_node_id(py, &p1)?,
p2: extract_node_id(py, &p2)?,
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 };
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 match self.inner(py).borrow_mut().pack(parents, now) {
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 Ok(packed) => Ok(PyBytes::new(py, &packed)),
Err(_) => Err(PyErr::new::<exc::OSError, _>(
py,
"Dirstate error".to_string(),
)),
}
}
def filefoldmapasdict(&self) -> PyResult<PyDict> {
let dict = PyDict::new(py);
Yuya Nishihara
rust-cpython: drop self.borrow_mut() in favor of PySharedRef wrapper
r43450 for (key, value) in
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 self.inner(py).borrow_mut().build_file_fold_map().iter()
Yuya Nishihara
rust-cpython: drop self.borrow_mut() in favor of PySharedRef wrapper
r43450 {
Raphaël Gomès
rust: do a clippy pass...
r45500 dict.set_item(
py,
Dan Villiom Podlaski Christiansen
rust: fix file folding map...
r46844 PyBytes::new(py, key.as_bytes()).into_object(),
PyBytes::new(py, value.as_bytes()).into_object(),
Raphaël Gomès
rust: do a clippy pass...
r45500 )?;
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 }
Ok(dict)
}
def __len__(&self) -> PyResult<usize> {
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 Ok(self.inner(py).borrow().len())
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 }
def __contains__(&self, key: PyObject) -> PyResult<bool> {
let key = key.extract::<PyBytes>(py)?;
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 Ok(self.inner(py).borrow().contains_key(HgPath::new(key.data(py))))
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 }
def __getitem__(&self, key: PyObject) -> PyResult<PyObject> {
let key = key.extract::<PyBytes>(py)?;
Raphaël Gomès
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf...
r43227 let key = HgPath::new(key.data(py));
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 match self.inner(py).borrow().get(key) {
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 Some(entry) => {
Yuya Nishihara
rust-cpython: add wrapper around decapsule_make_dirstate_tuple()...
r43479 Ok(make_dirstate_tuple(py, entry)?)
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 },
None => Err(PyErr::new::<exc::KeyError, _>(
py,
Raphaël Gomès
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf...
r43227 String::from_utf8_lossy(key.as_bytes()),
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 )),
}
}
def keys(&self) -> PyResult<DirstateMapKeysIterator> {
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 let leaked_ref = self.inner(py).leak_immutable();
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 DirstateMapKeysIterator::from_inner(
py,
Yuya Nishihara
rust-cpython: make PyLeakedRef operations relatively safe...
r43579 unsafe { leaked_ref.map(py, |o| o.iter()) },
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 )
}
def items(&self) -> PyResult<DirstateMapItemsIterator> {
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 let leaked_ref = self.inner(py).leak_immutable();
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 DirstateMapItemsIterator::from_inner(
py,
Yuya Nishihara
rust-cpython: make PyLeakedRef operations relatively safe...
r43579 unsafe { leaked_ref.map(py, |o| o.iter()) },
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 )
}
def __iter__(&self) -> PyResult<DirstateMapKeysIterator> {
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 let leaked_ref = self.inner(py).leak_immutable();
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 DirstateMapKeysIterator::from_inner(
py,
Yuya Nishihara
rust-cpython: make PyLeakedRef operations relatively safe...
r43579 unsafe { leaked_ref.map(py, |o| o.iter()) },
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 )
}
def getdirs(&self) -> PyResult<Dirs> {
// TODO don't copy, share the reference
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 self.inner(py).borrow_mut().set_dirs()
Raphaël Gomès
rust-dirs: handle forgotten `Result`s...
r44315 .map_err(|e| {
PyErr::new::<exc::ValueError, _>(py, e.to_string())
})?;
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 Dirs::from_inner(
py,
Yuya Nishihara
rust-dirstate: split DirsMultiset constructor per input type...
r43070 DirsMultiset::from_dirstate(
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 &self.inner(py).borrow(),
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 Some(EntryState::Removed),
Raphaël Gomès
rust-dirs: handle forgotten `Result`s...
r44315 )
.map_err(|e| {
PyErr::new::<exc::ValueError, _>(py, e.to_string())
})?,
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 )
}
def getalldirs(&self) -> PyResult<Dirs> {
// TODO don't copy, share the reference
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 self.inner(py).borrow_mut().set_all_dirs()
Raphaël Gomès
rust-dirs: handle forgotten `Result`s...
r44315 .map_err(|e| {
PyErr::new::<exc::ValueError, _>(py, e.to_string())
})?;
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 Dirs::from_inner(
py,
Yuya Nishihara
rust-dirstate: split DirsMultiset constructor per input type...
r43070 DirsMultiset::from_dirstate(
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 &self.inner(py).borrow(),
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 None,
Raphaël Gomès
rust-dirs: handle forgotten `Result`s...
r44315 ).map_err(|e| {
PyErr::new::<exc::ValueError, _>(py, e.to_string())
})?,
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 )
}
// TODO all copymap* methods, see docstring above
def copymapcopy(&self) -> PyResult<PyDict> {
let dict = PyDict::new(py);
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 for (key, value) in self.inner(py).borrow().copy_map.iter() {
Raphaël Gomès
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf...
r43227 dict.set_item(
py,
Raphaël Gomès
rust: do a clippy pass...
r45500 PyBytes::new(py, key.as_bytes()),
PyBytes::new(py, value.as_bytes()),
Raphaël Gomès
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf...
r43227 )?;
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 }
Ok(dict)
}
def copymapgetitem(&self, key: PyObject) -> PyResult<PyBytes> {
let key = key.extract::<PyBytes>(py)?;
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 match self.inner(py).borrow().copy_map.get(HgPath::new(key.data(py))) {
Raphaël Gomès
rust: do a clippy pass...
r45500 Some(copy) => Ok(PyBytes::new(py, copy.as_bytes())),
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 None => Err(PyErr::new::<exc::KeyError, _>(
py,
String::from_utf8_lossy(key.data(py)),
)),
}
}
def copymap(&self) -> PyResult<CopyMap> {
CopyMap::from_inner(py, self.clone_ref(py))
}
def copymaplen(&self) -> PyResult<usize> {
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 Ok(self.inner(py).borrow().copy_map.len())
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 }
def copymapcontains(&self, key: PyObject) -> PyResult<bool> {
let key = key.extract::<PyBytes>(py)?;
Raphaël Gomès
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf...
r43227 Ok(self
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 .inner(py)
Raphaël Gomès
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf...
r43227 .borrow()
.copy_map
.contains_key(HgPath::new(key.data(py))))
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 }
def copymapget(
&self,
key: PyObject,
default: Option<PyObject>
) -> PyResult<Option<PyObject>> {
let key = key.extract::<PyBytes>(py)?;
Raphaël Gomès
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf...
r43227 match self
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 .inner(py)
Raphaël Gomès
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf...
r43227 .borrow()
.copy_map
.get(HgPath::new(key.data(py)))
{
Some(copy) => Ok(Some(
Raphaël Gomès
rust: do a clippy pass...
r45500 PyBytes::new(py, copy.as_bytes()).into_object(),
Raphaël Gomès
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf...
r43227 )),
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 None => Ok(default),
}
}
def copymapsetitem(
&self,
key: PyObject,
value: PyObject
) -> PyResult<PyObject> {
let key = key.extract::<PyBytes>(py)?;
let value = value.extract::<PyBytes>(py)?;
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 self.inner(py).borrow_mut().copy_map.insert(
Raphaël Gomès
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf...
r43227 HgPathBuf::from_bytes(key.data(py)),
HgPathBuf::from_bytes(value.data(py)),
);
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 Ok(py.None())
}
def copymappop(
&self,
key: PyObject,
default: Option<PyObject>
) -> PyResult<Option<PyObject>> {
let key = key.extract::<PyBytes>(py)?;
Raphaël Gomès
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf...
r43227 match self
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 .inner(py)
Yuya Nishihara
rust-cpython: add panicking version of borrow_mut() and use it...
r44685 .borrow_mut()
Raphaël Gomès
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf...
r43227 .copy_map
.remove(HgPath::new(key.data(py)))
{
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 Some(_) => Ok(None),
None => Ok(default),
}
}
def copymapiter(&self) -> PyResult<CopyMapKeysIterator> {
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 let leaked_ref = self.inner(py).leak_immutable();
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 CopyMapKeysIterator::from_inner(
py,
Yuya Nishihara
rust-cpython: make PyLeakedRef operations relatively safe...
r43579 unsafe { leaked_ref.map(py, |o| o.copy_map.iter()) },
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 )
}
def copymapitemsiter(&self) -> PyResult<CopyMapItemsIterator> {
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 let leaked_ref = self.inner(py).leak_immutable();
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 CopyMapItemsIterator::from_inner(
py,
Yuya Nishihara
rust-cpython: make PyLeakedRef operations relatively safe...
r43579 unsafe { leaked_ref.map(py, |o| o.copy_map.iter()) },
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 )
}
});
impl DirstateMap {
Raphaël Gomès
rust-dirstate-status: rust-cpython bindings for `dirstate.status`...
r43567 pub fn get_inner<'a>(
&'a self,
py: Python<'a>,
) -> Ref<'a, RustDirstateMap> {
Yuya Nishihara
rust-cpython: rename inner_shared() to inner()...
r44702 self.inner(py).borrow()
Raphaël Gomès
rust-dirstate-status: rust-cpython bindings for `dirstate.status`...
r43567 }
Raphaël Gomès
rust: start plugging the dirstate tree behind a feature gate...
r46185 #[cfg(not(feature = "dirstate-tree"))]
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 fn translate_key(
py: Python,
Raphaël Gomès
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf...
r43227 res: (&HgPathBuf, &DirstateEntry),
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 ) -> PyResult<Option<PyBytes>> {
Raphaël Gomès
rust: do a clippy pass...
r45500 Ok(Some(PyBytes::new(py, res.0.as_bytes())))
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 }
Raphaël Gomès
rust: start plugging the dirstate tree behind a feature gate...
r46185 #[cfg(not(feature = "dirstate-tree"))]
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 fn translate_key_value(
py: Python,
Raphaël Gomès
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf...
r43227 res: (&HgPathBuf, &DirstateEntry),
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 ) -> PyResult<Option<(PyBytes, PyObject)>> {
let (f, entry) = res;
Ok(Some((
Raphaël Gomès
rust: do a clippy pass...
r45500 PyBytes::new(py, f.as_bytes()),
Raphaël Gomès
rust: start plugging the dirstate tree behind a feature gate...
r46185 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)?,
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 )))
}
}
Yuya Nishihara
rust-cpython: rename py_shared_iterator_impl to py_shared_iterator...
r43159 py_shared_iterator!(
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 DirstateMapKeysIterator,
Yuya Nishihara
rust-cpython: switch to upstreamed version of PySharedRefCell...
r44703 UnsafePyLeaked<StateMapIter<'static>>,
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 DirstateMap::translate_key,
Option<PyBytes>
);
Yuya Nishihara
rust-cpython: rename py_shared_iterator_impl to py_shared_iterator...
r43159 py_shared_iterator!(
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 DirstateMapItemsIterator,
Yuya Nishihara
rust-cpython: switch to upstreamed version of PySharedRefCell...
r44703 UnsafePyLeaked<StateMapIter<'static>>,
Raphaël Gomès
rust-dirstate: rust-cpython bridge for dirstatemap...
r42999 DirstateMap::translate_key_value,
Option<(PyBytes, PyObject)>
);
Yuya Nishihara
rust-dirstate: handle invalid length of p1/p2 parameters...
r43068
fn extract_node_id(py: Python, obj: &PyObject) -> PyResult<[u8; PARENT_SIZE]> {
let bytes = obj.extract::<PyBytes>(py)?;
match bytes.data(py).try_into() {
Ok(s) => Ok(s),
Err(e) => Err(PyErr::new::<exc::ValueError, _>(py, e.to_string())),
}
}