fix sync
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user