Add ephemeral prepare call to EdenApi trait

Summary: Add ephemeral_prepare to EdenApi, which allows calling the `/ephemeral/prepare` endpoint. This will be used when creating snapshots.

Reviewed By: liubov-dmitrieva

Differential Revision: D29987593

fbshipit-source-id: 2af2d9e051a8b4c124adf023ea4fd1bf2ec69e7c
This commit is contained in:
Yan Soares Couto 2021-08-02 05:35:17 -07:00 committed by Facebook GitHub Bot
parent d578bd9000
commit 32b8d7fe07
4 changed files with 77 additions and 17 deletions

View File

@ -24,6 +24,7 @@ use edenapi::types::CommitKnownResponse;
use edenapi::types::CommitLocationToHashRequest;
use edenapi::types::CommitLocationToHashResponse;
use edenapi::types::CommitRevlogData;
use edenapi::types::EphemeralPrepareResponse;
use edenapi::types::FileContent;
use edenapi::types::FileEntry;
use edenapi::types::FileSpec;
@ -512,6 +513,15 @@ impl EdenApi for EagerRepo {
"EagerRepo does not support upload_changesets endpoint".to_string(),
))
}
async fn ephemeral_prepare(
&self,
_repo: String,
) -> Result<Fetch<EphemeralPrepareResponse>, EdenApiError> {
Err(not_implemented_error(
"EagerRepo does not support ephemeral_prepare endpoint".to_string(),
))
}
}
impl EagerRepo {

View File

@ -28,20 +28,20 @@ use edenapi_types::{
json::ToJson,
wire::{
WireBookmarkEntry, WireCloneData, WireCommitHashToLocationResponse,
WireCommitLocationToHashResponse, WireFileEntry, WireHistoryResponseChunk, WireIdMapEntry,
WireLookupResponse, WireToApiConversionError, WireTreeEntry, WireUploadToken,
WireUploadTokensResponse, WireUploadTreeResponse,
WireCommitLocationToHashResponse, WireEphemeralPrepareResponse, WireFileEntry,
WireHistoryResponseChunk, WireIdMapEntry, WireLookupResponse, WireToApiConversionError,
WireTreeEntry, WireUploadToken, WireUploadTokensResponse, WireUploadTreeResponse,
},
AnyFileContentId, AnyId, Batch, BookmarkEntry, BookmarkRequest, CloneData,
CommitHashToLocationRequestBatch, CommitHashToLocationResponse, CommitLocationToHashRequest,
CommitLocationToHashRequestBatch, CommitLocationToHashResponse, CommitRevlogData,
CommitRevlogDataRequest, CompleteTreeRequest, EdenApiServerError, FileContentTokenMetadata,
FileEntry, FileRequest, FileSpec, HgFilenodeData, HgMutationEntryContent, HistoryEntry,
HistoryRequest, LookupRequest, LookupResponse, ServerError, ToApi, ToWire, TreeAttributes,
TreeEntry, TreeRequest, UploadBonsaiChangeset, UploadBonsaiChangesetsRequest,
UploadHgChangeset, UploadHgChangesetsRequest, UploadHgFilenodeRequest, UploadToken,
UploadTokenMetadata, UploadTokensResponse, UploadTreeEntry, UploadTreeRequest,
UploadTreeResponse,
CommitRevlogDataRequest, CompleteTreeRequest, EdenApiServerError, EphemeralPrepareRequest,
EphemeralPrepareResponse, FileContentTokenMetadata, FileEntry, FileRequest, FileSpec,
HgFilenodeData, HgMutationEntryContent, HistoryEntry, HistoryRequest, LookupRequest,
LookupResponse, ServerError, ToApi, ToWire, TreeAttributes, TreeEntry, TreeRequest,
UploadBonsaiChangeset, UploadBonsaiChangesetsRequest, UploadHgChangeset,
UploadHgChangesetsRequest, UploadHgFilenodeRequest, UploadToken, UploadTokenMetadata,
UploadTokensResponse, UploadTreeEntry, UploadTreeRequest, UploadTreeResponse,
};
use hg_http::http_client;
use http_client::{AsyncResponse, HttpClient, HttpClientError, Progress, Request};
@ -81,6 +81,7 @@ mod paths {
pub const UPLOAD_TREES: &str = "upload/trees";
pub const UPLOAD_CHANGESETS: &str = "upload/changesets";
pub const UPLOAD_BONSAI_CHANGESETS: &str = "upload/changesets/bonsai";
pub const EPHEMERAL_PREPARE: &str = "ephemeral/prepare";
}
pub struct Client {
@ -1054,6 +1055,33 @@ impl EdenApi for Client {
.fetch::<WireUploadTokensResponse>(vec![request], None)
.await?)
}
async fn ephemeral_prepare(
&self,
repo: String,
) -> Result<Fetch<EphemeralPrepareResponse>, EdenApiError> {
let msg = "Preparing ephemeral bubble";
tracing::info!("{}", &msg);
if self.config.debug {
eprintln!("{}", &msg);
}
let url = self.url(paths::EPHEMERAL_PREPARE, Some(&repo))?;
let req = EphemeralPrepareRequest {}.to_wire();
let request = self
.configure(Request::post(url.clone()))?
.cbor(&req)
.map_err(EdenApiError::RequestSerializationFailed)?;
let mut fetch = self
.fetch::<WireEphemeralPrepareResponse>(vec![request], None)
.await?;
fetch.entries = fetch
.entries
.inspect_ok(|r| tracing::info!("Created bubble {}", r.bubble_id))
.boxed();
Ok(fetch)
}
}
/// Split up a collection of keys into batches of at most `batch_size`.

View File

@ -15,9 +15,10 @@ use edenapi_types::CommitKnownResponse;
use edenapi_types::{
AnyFileContentId, AnyId, BookmarkEntry, CloneData, CommitHashToLocationResponse,
CommitLocationToHashRequest, CommitLocationToHashResponse, CommitRevlogData,
EdenApiServerError, FileEntry, FileSpec, HgFilenodeData, HgMutationEntryContent, HistoryEntry,
LookupResponse, TreeAttributes, TreeEntry, UploadBonsaiChangeset, UploadHgChangeset,
UploadToken, UploadTokensResponse, UploadTreeEntry, UploadTreeResponse,
EdenApiServerError, EphemeralPrepareResponse, FileEntry, FileSpec, HgFilenodeData,
HgMutationEntryContent, HistoryEntry, LookupResponse, TreeAttributes, TreeEntry,
UploadBonsaiChangeset, UploadHgChangeset, UploadToken, UploadTokensResponse, UploadTreeEntry,
UploadTreeResponse,
};
use http_client::Progress;
use minibytes::Bytes;
@ -186,6 +187,11 @@ pub trait EdenApi: Send + Sync + 'static {
changesets: Vec<UploadBonsaiChangeset>,
mutations: Vec<HgMutationEntryContent>,
) -> Result<Fetch<UploadTokensResponse>, EdenApiError>;
async fn ephemeral_prepare(
&self,
repo: String,
) -> Result<Fetch<EphemeralPrepareResponse>, EdenApiError>;
}
#[async_trait]
@ -415,4 +421,13 @@ impl EdenApi for Arc<dyn EdenApi> {
.upload_bonsai_changesets(repo, changesets, mutations)
.await
}
async fn ephemeral_prepare(
&self,
repo: String,
) -> Result<Fetch<EphemeralPrepareResponse>, EdenApiError> {
<Arc<dyn EdenApi> as Borrow<dyn EdenApi>>::borrow(self)
.ephemeral_prepare(repo)
.await
}
}

View File

@ -14,10 +14,10 @@ use edenapi::{EdenApi, EdenApiError, Fetch, ProgressCallback, ResponseMeta, Stat
use edenapi_types::{
AnyFileContentId, AnyId, BookmarkEntry, CloneData, CommitHashToLocationResponse,
CommitLocationToHashRequest, CommitLocationToHashResponse, CommitRevlogData,
EdenApiServerError, FileAttributes, FileContent, FileEntry, FileSpec, HgFilenodeData,
HgMutationEntryContent, HistoryEntry, LookupResponse, TreeAttributes, TreeEntry,
UploadBonsaiChangeset, UploadHgChangeset, UploadToken, UploadTokensResponse, UploadTreeEntry,
UploadTreeResponse,
EdenApiServerError, EphemeralPrepareResponse, FileAttributes, FileContent, FileEntry, FileSpec,
HgFilenodeData, HgMutationEntryContent, HistoryEntry, LookupResponse, TreeAttributes,
TreeEntry, UploadBonsaiChangeset, UploadHgChangeset, UploadToken, UploadTokensResponse,
UploadTreeEntry, UploadTreeResponse,
};
use futures::prelude::*;
use minibytes::Bytes;
@ -501,6 +501,13 @@ impl EdenApi for FakeEdenApi {
) -> Result<Fetch<UploadTokensResponse>, EdenApiError> {
unimplemented!();
}
async fn ephemeral_prepare(
&self,
_repo: String,
) -> Result<Fetch<EphemeralPrepareResponse>, EdenApiError> {
unimplemented!()
}
}
pub fn make_config(dir: impl AsRef<Path>) -> ConfigSet {