pyrevisionstore: use Key::new instead of Key::from_name_slice

Summary: migration

Differential Revision: D14945334

fbshipit-source-id: 1244f0d4fb6df59ebd3b72c55dbd1e1013531464
This commit is contained in:
Stefan Filip 2019-04-16 15:29:43 -07:00 committed by Facebook Github Bot
parent 09aa2f900f
commit 9c04803a33
4 changed files with 30 additions and 22 deletions

View File

@ -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, &[]);

View File

@ -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))
}

View File

@ -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))?,
})
}

View File

@ -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> {