commit cloud: initial update_references implementation

Summary: This simply call all the previously implemented update functions of every data structure

Reviewed By: mitrandir77

Differential Revision: D56691652

fbshipit-source-id: 7c16b4bade415403dc09aa6ad582aeb9ab20d331
This commit is contained in:
Luisa Vasquez Gomez 2024-04-29 16:16:34 -07:00 committed by Facebook GitHub Bot
parent ff71169c35
commit c344167c6d
2 changed files with 95 additions and 1 deletions

View File

@ -9,14 +9,23 @@
pub mod references; pub mod references;
pub mod sql; pub mod sql;
pub mod workspace; pub mod workspace;
use std::collections::HashMap;
use std::collections::HashSet;
use mononoke_types::Timestamp;
use crate::references::cast_references_data; use crate::references::cast_references_data;
use crate::references::fetch_references; use crate::references::fetch_references;
use crate::references::ReferencesData; use crate::references::ReferencesData;
use crate::sql::heads::update_heads;
use crate::sql::local_bookmarks::update_bookmarks;
use crate::sql::ops::Get; use crate::sql::ops::Get;
use crate::sql::ops::Insert;
use crate::sql::ops::SqlCommitCloud; use crate::sql::ops::SqlCommitCloud;
use crate::sql::remote_bookmarks::update_remote_bookmarks;
use crate::sql::remote_bookmarks::RefRemoteBookmark;
use crate::sql::snapshots::update_snapshots;
use crate::sql::versions::WorkspaceVersion; use crate::sql::versions::WorkspaceVersion;
#[facet::facet] #[facet::facet]
pub struct CommitCloud { pub struct CommitCloud {
pub storage: SqlCommitCloud, pub storage: SqlCommitCloud,
@ -35,6 +44,19 @@ pub struct CommitCloudContext {
pub workspace: String, pub workspace: String,
} }
pub struct UpdateReferencesParams {
pub version: i64,
pub removed_heads: HashSet<String>,
pub new_heads: Vec<String>,
pub updated_bookmarks: HashMap<String, String>,
pub removed_bookmarks: HashSet<String>,
pub updated_remote_bookmarks: Option<Vec<RefRemoteBookmark>>,
pub removed_remote_bookmarks: Option<Vec<RefRemoteBookmark>>,
pub new_snapshots: Vec<String>,
pub removed_snapshots: HashSet<String>,
pub client_info: Option<ClientInfo>,
}
impl CommitCloud { impl CommitCloud {
pub async fn get_workspace( pub async fn get_workspace(
&self, &self,
@ -96,4 +118,63 @@ impl CommitCloud {
Ok(references_data) Ok(references_data)
} }
pub async fn update_references(
&self,
ctx: CommitCloudContext,
params: UpdateReferencesParams,
) -> anyhow::Result<ReferencesData> {
let mut latest_version: u64 = 0;
let mut version_timestamp: i64 = 0;
let maybeworkspace = self
.get_workspace(&ctx.workspace.clone(), &ctx.reponame.clone())
.await?;
if !maybeworkspace.is_empty() {
latest_version = maybeworkspace[0].version;
version_timestamp = maybeworkspace[0].timestamp.timestamp_nanos();
}
let new_version = latest_version + 1;
update_heads(
&self.storage,
ctx.clone(),
params.removed_heads,
params.new_heads,
)
.await?;
update_bookmarks(
&self.storage,
ctx.clone(),
params.updated_bookmarks,
params.removed_bookmarks,
)
.await?;
update_remote_bookmarks(
&self.storage,
ctx.clone(),
params.updated_remote_bookmarks,
params.removed_remote_bookmarks,
)
.await?;
update_snapshots(
&self.storage,
ctx.clone(),
params.new_snapshots,
params.removed_snapshots,
)
.await?;
let args = WorkspaceVersion {
workspace: ctx.workspace.clone(),
version: new_version,
timestamp: Timestamp::from_timestamp_nanos(version_timestamp),
archived: false,
};
let _ = &self
.storage
.insert(ctx.reponame.clone(), ctx.workspace.clone(), args.clone())
.await?;
self.get_references(ctx, new_version).await
}
} }

View File

@ -32,6 +32,7 @@ use commit_cloud::references::ReferencesData;
use commit_cloud::sql::versions::WorkspaceVersion; use commit_cloud::sql::versions::WorkspaceVersion;
use commit_cloud::CommitCloudContext; use commit_cloud::CommitCloudContext;
use commit_cloud::CommitCloudRef; use commit_cloud::CommitCloudRef;
use commit_cloud::UpdateReferencesParams;
use commit_graph::CommitGraphRef; use commit_graph::CommitGraphRef;
use context::CoreContext; use context::CoreContext;
use edenapi_types::AnyId; use edenapi_types::AnyId;
@ -1074,6 +1075,18 @@ impl HgRepoContext {
.get_references(ctx, base_version) .get_references(ctx, base_version)
.await?) .await?)
} }
pub async fn cloud_update_references(
&self,
ctx: CommitCloudContext,
params: UpdateReferencesParams,
) -> Result<ReferencesData, MononokeError> {
Ok(self
.blob_repo()
.commit_cloud()
.update_references(ctx, params)
.await?)
}
} }
#[cfg(test)] #[cfg(test)]