mirror of
https://github.com/facebook/sapling.git
synced 2024-10-12 09:48:05 +03:00
pyrevisionstore: use Key::new instead of Key::from_name_slice
Summary: migration Differential Revision: D14945334 fbshipit-source-id: 1244f0d4fb6df59ebd3b72c55dbd1e1013531464
This commit is contained in:
parent
09aa2f900f
commit
9c04803a33
@ -3,8 +3,10 @@
|
||||
// This software may be used and distributed according to the terms of the
|
||||
// GNU General Public License version 2 or any later version.
|
||||
|
||||
use cpython::{PyBytes, PyDict, PyErr, PyIterator, PyList, PyObject, PyResult, Python,
|
||||
PythonObject, ToPyObject};
|
||||
use cpython::{
|
||||
PyBytes, PyDict, PyErr, PyIterator, PyList, PyObject, PyResult, Python, PythonObject,
|
||||
ToPyObject,
|
||||
};
|
||||
|
||||
use revisionstore::datastore::DataStore;
|
||||
use types::{Key, Node};
|
||||
@ -23,14 +25,14 @@ pub trait DataStorePyExt {
|
||||
|
||||
impl<T: DataStore> DataStorePyExt for T {
|
||||
fn get(&self, py: Python, name: &PyBytes, node: &PyBytes) -> PyResult<PyBytes> {
|
||||
let key = to_key(py, name, node);
|
||||
let key = to_key(py, name, node)?;
|
||||
let result = <DataStore>::get(self, &key).map_err(|e| to_pyerr(py, &e))?;
|
||||
|
||||
Ok(PyBytes::new(py, &result[..]))
|
||||
}
|
||||
|
||||
fn get_delta(&self, py: Python, name: &PyBytes, node: &PyBytes) -> PyResult<PyObject> {
|
||||
let key = to_key(py, name, node);
|
||||
let key = to_key(py, name, node)?;
|
||||
let delta = self.get_delta(&key).map_err(|e| to_pyerr(py, &e))?;
|
||||
|
||||
let (base_name, base_node) = if let Some(key) = delta.base {
|
||||
@ -49,12 +51,13 @@ impl<T: DataStore> DataStorePyExt for T {
|
||||
base_name.into_object(),
|
||||
base_node.into_object(),
|
||||
meta.into_object(),
|
||||
).into_py_object(py)
|
||||
)
|
||||
.into_py_object(py)
|
||||
.into_object())
|
||||
}
|
||||
|
||||
fn get_delta_chain(&self, py: Python, name: &PyBytes, node: &PyBytes) -> PyResult<PyList> {
|
||||
let key = to_key(py, name, node);
|
||||
let key = to_key(py, name, node)?;
|
||||
let deltachain = self.get_delta_chain(&key).map_err(|e| to_pyerr(py, &e))?;
|
||||
let pychain = deltachain
|
||||
.iter()
|
||||
@ -64,7 +67,7 @@ impl<T: DataStore> DataStorePyExt for T {
|
||||
}
|
||||
|
||||
fn get_meta(&self, py: Python, name: &PyBytes, node: &PyBytes) -> PyResult<PyDict> {
|
||||
let key = to_key(py, name, node);
|
||||
let key = to_key(py, name, node)?;
|
||||
let metadata = self.get_meta(&key).map_err(|e| to_pyerr(py, &e))?;
|
||||
let metadict = PyDict::new(py);
|
||||
if let Some(size) = metadata.size {
|
||||
@ -80,10 +83,12 @@ impl<T: DataStore> DataStorePyExt for T {
|
||||
fn get_missing(&self, py: Python, keys: &mut PyIterator) -> PyResult<PyList> {
|
||||
// Copy the PyObjects into a vector so we can get a reference iterator.
|
||||
// This lets us get a Vector of Keys without copying the strings.
|
||||
let keys = keys.map(|k| match k {
|
||||
let keys = keys
|
||||
.map(|k| match k {
|
||||
Ok(k) => from_tuple_to_key(py, &k),
|
||||
Err(e) => Err(e),
|
||||
}).collect::<Result<Vec<Key>, PyErr>>()?;
|
||||
})
|
||||
.collect::<Result<Vec<Key>, PyErr>>()?;
|
||||
let missing = self.get_missing(&keys[..]).map_err(|e| to_pyerr(py, &e))?;
|
||||
|
||||
let results = PyList::new(py, &[]);
|
||||
|
@ -20,7 +20,7 @@ pub trait HistoryStorePyExt {
|
||||
|
||||
impl<T: HistoryStore> HistoryStorePyExt for T {
|
||||
fn get_ancestors(&self, py: Python, name: &PyBytes, node: &PyBytes) -> PyResult<PyDict> {
|
||||
let key = to_key(py, name, node);
|
||||
let key = to_key(py, name, node)?;
|
||||
let ancestors = self.get_ancestors(&key).map_err(|e| to_pyerr(py, &e))?;
|
||||
let ancestors = ancestors
|
||||
.iter()
|
||||
@ -50,7 +50,7 @@ impl<T: HistoryStore> HistoryStorePyExt for T {
|
||||
}
|
||||
|
||||
fn get_node_info(&self, py: Python, name: &PyBytes, node: &PyBytes) -> PyResult<PyTuple> {
|
||||
let key = to_key(py, name, node);
|
||||
let key = to_key(py, name, node)?;
|
||||
let info = self.get_node_info(&key).map_err(|e| to_pyerr(py, &e))?;
|
||||
Ok(from_node_info(py, &key, &info))
|
||||
}
|
||||
|
@ -65,7 +65,8 @@ impl DataStore for PythonDataStore {
|
||||
let py_delta_node = bytes_from_tuple(py, &py_tuple, 3)?;
|
||||
let py_bytes = bytes_from_tuple(py, &py_tuple, 4)?;
|
||||
|
||||
let base_key = to_key(py, &py_delta_name, &py_delta_node);
|
||||
let base_key =
|
||||
to_key(py, &py_delta_name, &py_delta_node).map_err(|e| pyerr_to_error(py, e))?;
|
||||
Ok(Delta {
|
||||
data: py_bytes.data(py).to_vec().into(),
|
||||
base: if base_key.node.is_null() {
|
||||
@ -73,7 +74,7 @@ impl DataStore for PythonDataStore {
|
||||
} else {
|
||||
Some(base_key)
|
||||
},
|
||||
key: to_key(py, &py_name, &py_node),
|
||||
key: to_key(py, &py_name, &py_node).map_err(|e| pyerr_to_error(py, e))?,
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -12,7 +12,7 @@ use cpython::{
|
||||
use failure::{Error, Fallible};
|
||||
use revisionstore::datastore::Delta;
|
||||
use revisionstore::error::KeyError;
|
||||
use types::{Key, Node};
|
||||
use types::{Key, Node, RepoPath};
|
||||
|
||||
use crate::pyerror::pyerr_to_error;
|
||||
|
||||
@ -29,10 +29,11 @@ pub fn to_pyerr(py: Python, error: &Error) -> PyErr {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn to_key(py: Python, name: &PyBytes, node: &PyBytes) -> Key {
|
||||
pub fn to_key(py: Python, name: &PyBytes, node: &PyBytes) -> PyResult<Key> {
|
||||
let mut bytes: [u8; 20] = Default::default();
|
||||
bytes.copy_from_slice(&node.data(py)[0..20]);
|
||||
Key::from_name_slice(name.data(py).into(), (&bytes).into())
|
||||
let path = RepoPath::from_utf8(name.data(py)).map_err(|e| to_pyerr(py, &e))?;
|
||||
Ok(Key::new(path.to_owned(), (&bytes).into()))
|
||||
}
|
||||
|
||||
pub fn from_key(py: Python, key: &Key) -> (PyBytes, PyBytes) {
|
||||
@ -51,7 +52,8 @@ pub fn from_tuple_to_delta<'a>(py: Python, py_delta: &PyObject) -> PyResult<Delt
|
||||
let py_delta_node = PyBytes::extract(py, &py_delta.get_item(py, 3))?;
|
||||
let py_bytes = PyBytes::extract(py, &py_delta.get_item(py, 4))?;
|
||||
|
||||
let base_key = to_key(py, &py_delta_name, &py_delta_node);
|
||||
let key = to_key(py, &py_name, &py_node)?;
|
||||
let base_key = to_key(py, &py_delta_name, &py_delta_node)?;
|
||||
Ok(Delta {
|
||||
data: py_bytes.data(py).to_vec().into(),
|
||||
base: if base_key.node.is_null() {
|
||||
@ -59,7 +61,7 @@ pub fn from_tuple_to_delta<'a>(py: Python, py_delta: &PyObject) -> PyResult<Delt
|
||||
} else {
|
||||
Some(base_key)
|
||||
},
|
||||
key: to_key(py, &py_name, &py_node),
|
||||
key,
|
||||
})
|
||||
}
|
||||
|
||||
@ -69,7 +71,7 @@ pub fn from_delta_to_tuple(py: Python, delta: &Delta) -> PyObject {
|
||||
Some(base) => from_key(py, &base),
|
||||
None => from_key(
|
||||
py,
|
||||
&Key::from_name_slice(delta.key.name().to_vec(), Node::null_id().clone()),
|
||||
&Key::new(delta.key.path.clone(), Node::null_id().clone()),
|
||||
),
|
||||
};
|
||||
let bytes = PyBytes::new(py, &delta.data);
|
||||
@ -94,7 +96,7 @@ pub fn from_tuple_to_key(py: Python, py_tuple: &PyObject) -> PyResult<Key> {
|
||||
let py_tuple = <&PyTuple>::extract(py, &py_tuple)?.as_slice(py);
|
||||
let name = <&PyBytes>::extract(py, &py_tuple[0])?;
|
||||
let node = <&PyBytes>::extract(py, &py_tuple[1])?;
|
||||
Ok(to_key(py, &name, &node))
|
||||
to_key(py, &name, &node)
|
||||
}
|
||||
|
||||
pub fn bytes_from_tuple(py: Python, tuple: &PyTuple, index: usize) -> Fallible<PyBytes> {
|
||||
|
Loading…
Reference in New Issue
Block a user