From dc6c20d29ea4456eee1dbc2aa8757fe955d1afc7 Mon Sep 17 00:00:00 2001 From: DanConwayDev Date: Thu, 26 Feb 2026 12:24:40 +0000 Subject: fix: report per-relay publish results in send_events summary Change send_events() return type from Result<()> to Result> so callers can inspect which relays accepted events. Update the finish message to show "Published to X/N relays (failed: ...)" instead of the unconditional "Published ... to nostr relays". --- src/bin/git_remote_nostr/push.rs | 2 +- src/bin/ngit/sub_commands/init.rs | 2 +- src/bin/ngit/sub_commands/repo/accept.rs | 2 +- src/bin/ngit/sub_commands/send.rs | 2 +- src/lib/accept_maintainership.rs | 2 +- src/lib/client.rs | 37 ++++++++++++++++++++++++++++---- src/lib/login/fresh.rs | 2 +- src/lib/push.rs | 2 +- 8 files changed, 40 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/bin/git_remote_nostr/push.rs b/src/bin/git_remote_nostr/push.rs index 06624f4..91b01b9 100644 --- a/src/bin/git_remote_nostr/push.rs +++ b/src/bin/git_remote_nostr/push.rs @@ -298,7 +298,7 @@ async fn create_and_publish_events_and_proposals( // TODO check whether tip of each branch pushed is on at least one git server // before broadcasting the nostr state if !events.is_empty() { - send_events( + let _relay_results = send_events( client, Some(git_repo.get_path()?), events, diff --git a/src/bin/ngit/sub_commands/init.rs b/src/bin/ngit/sub_commands/init.rs index 5ff57d5..021a33e 100644 --- a/src/bin/ngit/sub_commands/init.rs +++ b/src/bin/ngit/sub_commands/init.rs @@ -1266,7 +1266,7 @@ async fn publish_and_finalize( // Step 5: Publish events client.set_signer(signer).await; - send_events( + let _ = send_events( client, Some(git_repo_path), events, diff --git a/src/bin/ngit/sub_commands/repo/accept.rs b/src/bin/ngit/sub_commands/repo/accept.rs index 5564b77..eaea107 100644 --- a/src/bin/ngit/sub_commands/repo/accept.rs +++ b/src/bin/ngit/sub_commands/repo/accept.rs @@ -212,7 +212,7 @@ async fn accept_with_grasp_servers( client.set_signer(signer.clone()).await; - send_events( + let _ = send_events( client, Some(git_repo.get_path()?), vec![repo_event], diff --git a/src/bin/ngit/sub_commands/send.rs b/src/bin/ngit/sub_commands/send.rs index 6b18e84..86af2d3 100644 --- a/src/bin/ngit/sub_commands/send.rs +++ b/src/bin/ngit/sub_commands/send.rs @@ -409,7 +409,7 @@ pub async fn launch(cli_args: &Cli, args: &SubCommandArgs, no_fetch: bool) -> Re events }; - send_events( + let _ = send_events( &client, Some(git_repo_path), events.clone(), diff --git a/src/lib/accept_maintainership.rs b/src/lib/accept_maintainership.rs index 086b858..3375ca3 100644 --- a/src/lib/accept_maintainership.rs +++ b/src/lib/accept_maintainership.rs @@ -149,7 +149,7 @@ pub async fn accept_maintainership_with_defaults( client.set_signer(signer.clone()).await; - send_events( + let _ = send_events( client, Some(git_repo.get_path()?), vec![repo_event], diff --git a/src/lib/client.rs b/src/lib/client.rs index 2a4e081..c5c38cf 100644 --- a/src/lib/client.rs +++ b/src/lib/client.rs @@ -2447,7 +2447,7 @@ pub async fn send_events( repo_read_relays: Vec, animate: bool, silent: bool, -) -> Result<()> { +) -> Result> { // Only include default relays as fallback when there are no repo relays // (bootstrapping case, e.g. new account signup). When repo relays exist, // trust the repo and user relay configuration. @@ -2614,7 +2614,7 @@ pub async fn send_events( })?; #[allow(clippy::borrow_deref_ref)] - join_all(relays.iter().map(|&relay| { + let relay_results: Vec<(String, bool)> = join_all(relays.iter().map(|&relay| { let reveal_state_clone = reveal_state.clone(); let my_write_relays = my_write_relays.clone(); let repo_read_relays = repo_read_relays.clone(); @@ -2691,6 +2691,7 @@ pub async fn send_events( pb.set_style(pb_after_style_succeeded.clone()); finish_bar(&pb, String::new(), &reveal_state_clone); } + (relay_clean.to_string(), !failed) } })) .await; @@ -2700,12 +2701,40 @@ pub async fn send_events( if let Some(handle) = timer_handle { handle.abort(); } + + let succeeded_count = relay_results.iter().filter(|(_, ok)| *ok).count(); + let total_count = relay_results.len(); + let failed_relays: Vec<&str> = relay_results + .iter() + .filter(|(_, ok)| !*ok) + .map(|(url, _)| { + url.strip_prefix("wss://") + .or_else(|| url.strip_prefix("ws://")) + .unwrap_or(url) + .trim_end_matches('/') + }) + .collect(); + + let finish_message = if succeeded_count == total_count { + format!("Published {events_description} to {total_count} relays") + } else if succeeded_count > 0 { + format!( + "Published {events_description} to {succeeded_count}/{total_count} relays (failed: {})", + failed_relays.join(" ") + ) + } else { + format!( + "failed to publish {events_description} to any relay (failed: {})", + failed_relays.join(" ") + ) + }; + if let Some((_, spinner)) = &spinner_multi { spinner.set_style(ProgressStyle::with_template("{msg}").unwrap()); - spinner.finish_with_message(format!("Published {events_description} to nostr relays")); + spinner.finish_with_message(finish_message); } - Ok(()) + Ok(relay_results) } /// Builds a human-readable description of what is being published, e.g. diff --git a/src/lib/login/fresh.rs b/src/lib/login/fresh.rs index 2f6becf..e81b74a 100644 --- a/src/lib/login/fresh.rs +++ b/src/lib/login/fresh.rs @@ -810,7 +810,7 @@ pub async fn signup_non_interactive( save_event_in_global_cache(git_repo_path, &relay_list).await?; if publish { - send_events( + let _ = send_events( client, git_repo_path, vec![profile, relay_list], diff --git a/src/lib/push.rs b/src/lib/push.rs index 5544066..7374fb0 100644 --- a/src/lib/push.rs +++ b/src/lib/push.rs @@ -665,7 +665,7 @@ pub async fn select_servers_push_refs_and_generate_pr_or_pr_update_event( }; // pubish event to my-relays and my-fork-relays new_grasp_server_events.push(updated_user_repo_ref.to_event(signer).await?); - send_events( + let _ = send_events( client, Some(git_repo_path), new_grasp_server_events, -- cgit v1.2.3