This commit is contained in:
2026-10-13 09:05:51 +07:00
parent 7878feb236
commit 4a57a01f4a
7 changed files with 394 additions and 465 deletions
+52 -40
View File
@@ -21,7 +21,9 @@ use crate::bootstrap::{
};
use crate::git_store::Mirrors;
use crate::inbox::Inbox;
use crate::push::{GraspPush, PushOutcome, grasp_base_url, grasp_clone_url};
use crate::push::{
PushOutcome, grasp_base_url, grasp_clone_url, push_staged_to_grasps, require_relay_accepted,
};
use crate::repos::RepoListStore;
pub const USER_KEYRING: &str = "Signed Safe Storage";
@@ -452,16 +454,19 @@ impl Backend {
.map(|url| RelayUrl::parse(url).expect("valid relay URL"))
.collect();
let pusher = GraspPush::new(this.client.clone(), this.signer.clone());
for builder in [
RelayList::new(relays).into_event_builder(),
metadata,
GitUserGraspList { grasp_servers }.into_event_builder(),
] {
let pusher = pusher.clone();
let client = this.client.clone();
let signer = this.signer.clone();
cx.background_spawn(async move {
pusher.publish_best_effort(builder).await;
let event = builder.finalize_async(&signer).await?;
let output = client.send_event(&event).broadcast().await?;
require_relay_accepted(output, event)?;
Ok::<(), anyhow::Error>(())
})
.detach();
}
@@ -792,7 +797,8 @@ impl Backend {
PushOutcome::default()
} else {
let push = cx.background_spawn({
let pusher = GraspPush::new(client.clone(), signer.clone());
let client = client.clone();
let signer = signer.clone();
let path = path.clone();
let owner = owner.clone();
let repo_id = repo_id.clone();
@@ -801,20 +807,21 @@ impl Backend {
let head = head.clone();
let executor = cx.background_executor().clone();
async move {
pusher
.push_staged_to_grasps(
&repo_id,
&refs,
head.as_deref(),
&path,
&owner,
&relays,
&executor,
|path, base, owner, repo_id| {
Repo::open(path)?.push_all(base, owner, repo_id)
},
)
.await
push_staged_to_grasps(
&client,
&signer,
&repo_id,
&refs,
head.as_deref(),
&path,
&owner,
&relays,
&executor,
|path, base, owner, repo_id| {
Repo::open(path)?.push_all(base, owner, repo_id)
},
)
.await
}
});
push.await
@@ -1136,15 +1143,16 @@ impl Backend {
// Each target gets its own deletion event.
fn retract_events(&mut self, events: &[Event], cx: &mut Context<Self>) {
let pusher = GraspPush::new(self.client.clone(), self.signer.clone());
for event in events.iter().cloned() {
let pusher = pusher.clone();
let client = self.client.clone();
let signer = self.signer.clone();
cx.spawn(async move |_this, _cx| {
if let Err(e) = pusher.retract_event(&event).await {
log::warn!("failed to retract event {}: {e}", event.id);
}
cx.background_spawn(async move {
let builder = EventDeletionRequest::new().id(event.id);
let deletion = builder.finalize_async(&signer).await?;
client.send_event(&deletion).broadcast().await?;
Ok::<(), anyhow::Error>(())
})
.detach();
}
@@ -1198,23 +1206,26 @@ async fn announce_repository_and_push(
let builder = announcement.into_event_builder();
let event = builder.finalize_async(signer).await?;
let output = client.send_event(&event).broadcast().await?;
GraspPush::require_relay_accepted(output, event)?
require_relay_accepted(output, event)?
};
// The state event is the push authorization.
let outcome = if refs.is_empty() {
PushOutcome::default()
} else {
let pusher = GraspPush::new(client.clone(), signer.clone());
let repo_id = repo_id.to_owned();
let owner = owner.to_owned();
let servers = servers.to_vec();
let head = head.clone();
let path = path.to_path_buf();
let executor = cx.background_executor().clone();
cx.background_spawn(async move {
pusher
.push_staged_to_grasps(
let push = {
let client = client.clone();
let signer = signer.clone();
let repo_id = repo_id.to_owned();
let owner = owner.to_owned();
let servers = servers.to_vec();
let head = head.clone();
let path = path.to_path_buf();
let executor = cx.background_executor().clone();
cx.background_spawn(async move {
push_staged_to_grasps(
&client,
&signer,
&repo_id,
&refs,
head.as_deref(),
@@ -1225,8 +1236,9 @@ async fn announce_repository_and_push(
push,
)
.await
})
.await
})
};
push.await
};
if outcome.accepted() == 0 {