bindings: use pycell instead of mincode for pull data

Reviewed By: quark-zju

Differential Revision: D29474445

fbshipit-source-id: dd6536bdbac6e5690c918a222bf3823537ceffcc
This commit is contained in:
Andrey Chursin 2021-07-01 10:47:44 -07:00 committed by Facebook GitHub Bot
parent b3187fa74a
commit 7ad57c10a5
3 changed files with 17 additions and 14 deletions

View File

@ -9,10 +9,11 @@ use crate::dagalgo::dagalgo;
use crate::idmap; use crate::idmap;
use crate::Names; use crate::Names;
use crate::Spans; use crate::Spans;
use anyhow::Result; use anyhow::{format_err, Result};
use async_runtime::try_block_unless_interrupted as block_on; use async_runtime::try_block_unless_interrupted as block_on;
use cpython::*; use cpython::*;
use cpython_ext::convert::BytesLike; use cpython_ext::convert::BytesLike;
use cpython_ext::pycell;
use cpython_ext::ExtractInner; use cpython_ext::ExtractInner;
use cpython_ext::PyNone; use cpython_ext::PyNone;
use cpython_ext::PyPath; use cpython_ext::PyPath;
@ -126,14 +127,14 @@ py_class!(pub class commits |py| {
Ok(PyNone) Ok(PyNone)
} }
/// Import pull data (serialized in mincode) and flush. /// Import pull data(inside pycell) and flush.
/// Returns (commit_count, segment_count) on success. /// Returns (commit_count, segment_count) on success.
def importpulldata(&self, data: PyBytes) -> PyResult<(u64, usize)> { def importpulldata(&self, data: pycell) -> PyResult<(u64, usize)> {
let data: CloneData<Vertex> = mincode::deserialize(data.data(py)).map_pyerr(py)?; let data: Box<CloneData<Vertex>> = data.take(py).ok_or(format_err!("Data is not CloneData")).map_pyerr(py)?;
let commits = data.flat_segments.vertex_count(); let commits = data.flat_segments.vertex_count();
let segments = data.flat_segments.segment_count(); let segments = data.flat_segments.segment_count();
let mut inner = self.inner(py).borrow_mut(); let mut inner = self.inner(py).borrow_mut();
block_on(inner.import_pull_data(data)).map_pyerr(py)?; block_on(inner.import_pull_data(*data)).map_pyerr(py)?;
Ok((commits, segments)) Ok((commits, segments))
} }

View File

@ -12,6 +12,7 @@ use cpython::*;
use cpython_async::PyFuture; use cpython_async::PyFuture;
use cpython_async::TStream; use cpython_async::TStream;
use cpython_ext::convert::Serde; use cpython_ext::convert::Serde;
use cpython_ext::pycell;
use cpython_ext::{ExtractInner, ExtractInnerRef, PyPathBuf, ResultPyErrExt}; use cpython_ext::{ExtractInner, ExtractInnerRef, PyPathBuf, ResultPyErrExt};
use edenapi::{Builder, EdenApi}; use edenapi::{Builder, EdenApi};
use edenapi_types::CommitGraphEntry; use edenapi_types::CommitGraphEntry;
@ -230,10 +231,9 @@ py_class!(pub class client |py| {
self.inner(py).clone().clone_data_py(py, repo) self.inner(py).clone().clone_data_py(py, repo)
} }
/// pullfastforwardmaster(repo: str, old_master: Bytes, new_master: Bytes) -> bytes /// pullfastforwardmaster(repo: str, old_master: Bytes, new_master: Bytes) -> pycell
/// mincode-serialized CloneData.
def pullfastforwardmaster(&self, repo: String, old_master: PyBytes, new_master: PyBytes) def pullfastforwardmaster(&self, repo: String, old_master: PyBytes, new_master: PyBytes)
-> PyResult<PyBytes> -> PyResult<pycell>
{ {
self.inner(py).clone().pull_fast_forward_master_py(py, repo, old_master, new_master) self.inner(py).clone().pull_fast_forward_master_py(py, repo, old_master, new_master)
} }

View File

@ -15,8 +15,9 @@ use async_runtime::block_unless_interrupted;
use cpython_async::PyFuture; use cpython_async::PyFuture;
use cpython_async::TStream; use cpython_async::TStream;
use cpython_ext::convert::Serde; use cpython_ext::convert::Serde;
use cpython_ext::pycell;
use cpython_ext::{PyPathBuf, ResultPyErrExt}; use cpython_ext::{PyPathBuf, ResultPyErrExt};
use dag_types::Location; use dag_types::{Location, VertexName};
use edenapi::{EdenApi, EdenApiBlocking, EdenApiError, Fetch, Stats}; use edenapi::{EdenApi, EdenApiBlocking, EdenApiError, Fetch, Stats};
use edenapi_types::CommitGraphEntry; use edenapi_types::CommitGraphEntry;
use edenapi_types::CommitKnownResponse; use edenapi_types::CommitKnownResponse;
@ -402,10 +403,10 @@ pub trait EdenApiPyExt: EdenApi {
repo: String, repo: String,
old_master: PyBytes, old_master: PyBytes,
new_master: PyBytes, new_master: PyBytes,
) -> PyResult<PyBytes> { ) -> PyResult<pycell> {
let old_master = to_hgid(py, &old_master); let old_master = to_hgid(py, &old_master);
let new_master = to_hgid(py, &new_master); let new_master = to_hgid(py, &new_master);
let bytes = { let data = {
py.allow_threads(|| { py.allow_threads(|| {
block_unless_interrupted(async move { block_unless_interrupted(async move {
match self match self
@ -413,15 +414,16 @@ pub trait EdenApiPyExt: EdenApi {
.await .await
{ {
Err(e) => Err(e), Err(e) => Err(e),
Ok(data) => Ok(mincode::serialize(&data)), Ok(data) => Ok(data.convert_vertex(|hgid| {
VertexName(hgid.into_byte_array().to_vec().into())
})),
} }
}) })
}) })
.map_pyerr(py)? .map_pyerr(py)?
.map_pyerr(py)? .map_pyerr(py)?
.map_pyerr(py)?
}; };
Ok(PyBytes::new(py, &bytes)) pycell::new(py, data)
} }
fn lookup_file_contents( fn lookup_file_contents(