diff options
| author | DanConwayDev <DanConwayDev@protonmail.com> | 2026-02-26 12:24:40 +0000 |
|---|---|---|
| committer | DanConwayDev <DanConwayDev@protonmail.com> | 2026-02-26 15:26:16 +0000 |
| commit | dc6c20d29ea4456eee1dbc2aa8757fe955d1afc7 (patch) | |
| tree | 6230652be620a4647ffe1ad26c654b61f36cedac | |
| parent | 237ab4ebcdc5bf58f98958db5375d56baf8046a0 (diff) | |
fix: report per-relay publish results in send_events summary
Change send_events() return type from Result<()> to
Result<Vec<(String, bool)>> 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".
| -rw-r--r-- | CHANGELOG.md | 1 | ||||
| -rw-r--r-- | src/bin/git_remote_nostr/push.rs | 2 | ||||
| -rw-r--r-- | src/bin/ngit/sub_commands/init.rs | 2 | ||||
| -rw-r--r-- | src/bin/ngit/sub_commands/repo/accept.rs | 2 | ||||
| -rw-r--r-- | src/bin/ngit/sub_commands/send.rs | 2 | ||||
| -rw-r--r-- | src/lib/accept_maintainership.rs | 2 | ||||
| -rw-r--r-- | src/lib/client.rs | 37 | ||||
| -rw-r--r-- | src/lib/login/fresh.rs | 2 | ||||
| -rw-r--r-- | src/lib/push.rs | 2 |
9 files changed, 41 insertions, 11 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index e6a7721..6cafa52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md | |||
| @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | |||
| 14 | ### Fixed | 14 | ### Fixed |
| 15 | 15 | ||
| 16 | - `ngit sync` using wrong refspec source (`refs/remotes/origin/refs/heads/master` instead of `refs/remotes/origin/master`), causing sync to fail with "src refspec does not match any existing object" | 16 | - `ngit sync` using wrong refspec source (`refs/remotes/origin/refs/heads/master` instead of `refs/remotes/origin/master`), causing sync to fail with "src refspec does not match any existing object" |
| 17 | - State event publish failures silently swallowed during push; summary now shows `"Published to X/N relays (failed: relay1 relay2)"` instead of unconditional success message | ||
| 17 | 18 | ||
| 18 | ## [2.2.1] - 2026-02-25 | 19 | ## [2.2.1] - 2026-02-25 |
| 19 | 20 | ||
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( | |||
| 298 | // TODO check whether tip of each branch pushed is on at least one git server | 298 | // TODO check whether tip of each branch pushed is on at least one git server |
| 299 | // before broadcasting the nostr state | 299 | // before broadcasting the nostr state |
| 300 | if !events.is_empty() { | 300 | if !events.is_empty() { |
| 301 | send_events( | 301 | let _relay_results = send_events( |
| 302 | client, | 302 | client, |
| 303 | Some(git_repo.get_path()?), | 303 | Some(git_repo.get_path()?), |
| 304 | events, | 304 | 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( | |||
| 1266 | // Step 5: Publish events | 1266 | // Step 5: Publish events |
| 1267 | client.set_signer(signer).await; | 1267 | client.set_signer(signer).await; |
| 1268 | 1268 | ||
| 1269 | send_events( | 1269 | let _ = send_events( |
| 1270 | client, | 1270 | client, |
| 1271 | Some(git_repo_path), | 1271 | Some(git_repo_path), |
| 1272 | events, | 1272 | 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( | |||
| 212 | 212 | ||
| 213 | client.set_signer(signer.clone()).await; | 213 | client.set_signer(signer.clone()).await; |
| 214 | 214 | ||
| 215 | send_events( | 215 | let _ = send_events( |
| 216 | client, | 216 | client, |
| 217 | Some(git_repo.get_path()?), | 217 | Some(git_repo.get_path()?), |
| 218 | vec![repo_event], | 218 | 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 | |||
| 409 | events | 409 | events |
| 410 | }; | 410 | }; |
| 411 | 411 | ||
| 412 | send_events( | 412 | let _ = send_events( |
| 413 | &client, | 413 | &client, |
| 414 | Some(git_repo_path), | 414 | Some(git_repo_path), |
| 415 | events.clone(), | 415 | 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( | |||
| 149 | 149 | ||
| 150 | client.set_signer(signer.clone()).await; | 150 | client.set_signer(signer.clone()).await; |
| 151 | 151 | ||
| 152 | send_events( | 152 | let _ = send_events( |
| 153 | client, | 153 | client, |
| 154 | Some(git_repo.get_path()?), | 154 | Some(git_repo.get_path()?), |
| 155 | vec![repo_event], | 155 | 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( | |||
| 2447 | repo_read_relays: Vec<RelayUrl>, | 2447 | repo_read_relays: Vec<RelayUrl>, |
| 2448 | animate: bool, | 2448 | animate: bool, |
| 2449 | silent: bool, | 2449 | silent: bool, |
| 2450 | ) -> Result<()> { | 2450 | ) -> Result<Vec<(String, bool)>> { |
| 2451 | // Only include default relays as fallback when there are no repo relays | 2451 | // Only include default relays as fallback when there are no repo relays |
| 2452 | // (bootstrapping case, e.g. new account signup). When repo relays exist, | 2452 | // (bootstrapping case, e.g. new account signup). When repo relays exist, |
| 2453 | // trust the repo and user relay configuration. | 2453 | // trust the repo and user relay configuration. |
| @@ -2614,7 +2614,7 @@ pub async fn send_events( | |||
| 2614 | })?; | 2614 | })?; |
| 2615 | 2615 | ||
| 2616 | #[allow(clippy::borrow_deref_ref)] | 2616 | #[allow(clippy::borrow_deref_ref)] |
| 2617 | join_all(relays.iter().map(|&relay| { | 2617 | let relay_results: Vec<(String, bool)> = join_all(relays.iter().map(|&relay| { |
| 2618 | let reveal_state_clone = reveal_state.clone(); | 2618 | let reveal_state_clone = reveal_state.clone(); |
| 2619 | let my_write_relays = my_write_relays.clone(); | 2619 | let my_write_relays = my_write_relays.clone(); |
| 2620 | let repo_read_relays = repo_read_relays.clone(); | 2620 | let repo_read_relays = repo_read_relays.clone(); |
| @@ -2691,6 +2691,7 @@ pub async fn send_events( | |||
| 2691 | pb.set_style(pb_after_style_succeeded.clone()); | 2691 | pb.set_style(pb_after_style_succeeded.clone()); |
| 2692 | finish_bar(&pb, String::new(), &reveal_state_clone); | 2692 | finish_bar(&pb, String::new(), &reveal_state_clone); |
| 2693 | } | 2693 | } |
| 2694 | (relay_clean.to_string(), !failed) | ||
| 2694 | } | 2695 | } |
| 2695 | })) | 2696 | })) |
| 2696 | .await; | 2697 | .await; |
| @@ -2700,12 +2701,40 @@ pub async fn send_events( | |||
| 2700 | if let Some(handle) = timer_handle { | 2701 | if let Some(handle) = timer_handle { |
| 2701 | handle.abort(); | 2702 | handle.abort(); |
| 2702 | } | 2703 | } |
| 2704 | |||
| 2705 | let succeeded_count = relay_results.iter().filter(|(_, ok)| *ok).count(); | ||
| 2706 | let total_count = relay_results.len(); | ||
| 2707 | let failed_relays: Vec<&str> = relay_results | ||
| 2708 | .iter() | ||
| 2709 | .filter(|(_, ok)| !*ok) | ||
| 2710 | .map(|(url, _)| { | ||
| 2711 | url.strip_prefix("wss://") | ||
| 2712 | .or_else(|| url.strip_prefix("ws://")) | ||
| 2713 | .unwrap_or(url) | ||
| 2714 | .trim_end_matches('/') | ||
| 2715 | }) | ||
| 2716 | .collect(); | ||
| 2717 | |||
| 2718 | let finish_message = if succeeded_count == total_count { | ||
| 2719 | format!("Published {events_description} to {total_count} relays") | ||
| 2720 | } else if succeeded_count > 0 { | ||
| 2721 | format!( | ||
| 2722 | "Published {events_description} to {succeeded_count}/{total_count} relays (failed: {})", | ||
| 2723 | failed_relays.join(" ") | ||
| 2724 | ) | ||
| 2725 | } else { | ||
| 2726 | format!( | ||
| 2727 | "failed to publish {events_description} to any relay (failed: {})", | ||
| 2728 | failed_relays.join(" ") | ||
| 2729 | ) | ||
| 2730 | }; | ||
| 2731 | |||
| 2703 | if let Some((_, spinner)) = &spinner_multi { | 2732 | if let Some((_, spinner)) = &spinner_multi { |
| 2704 | spinner.set_style(ProgressStyle::with_template("{msg}").unwrap()); | 2733 | spinner.set_style(ProgressStyle::with_template("{msg}").unwrap()); |
| 2705 | spinner.finish_with_message(format!("Published {events_description} to nostr relays")); | 2734 | spinner.finish_with_message(finish_message); |
| 2706 | } | 2735 | } |
| 2707 | 2736 | ||
| 2708 | Ok(()) | 2737 | Ok(relay_results) |
| 2709 | } | 2738 | } |
| 2710 | 2739 | ||
| 2711 | /// Builds a human-readable description of what is being published, e.g. | 2740 | /// 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( | |||
| 810 | save_event_in_global_cache(git_repo_path, &relay_list).await?; | 810 | save_event_in_global_cache(git_repo_path, &relay_list).await?; |
| 811 | 811 | ||
| 812 | if publish { | 812 | if publish { |
| 813 | send_events( | 813 | let _ = send_events( |
| 814 | client, | 814 | client, |
| 815 | git_repo_path, | 815 | git_repo_path, |
| 816 | vec![profile, relay_list], | 816 | 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( | |||
| 665 | }; | 665 | }; |
| 666 | // pubish event to my-relays and my-fork-relays | 666 | // pubish event to my-relays and my-fork-relays |
| 667 | new_grasp_server_events.push(updated_user_repo_ref.to_event(signer).await?); | 667 | new_grasp_server_events.push(updated_user_repo_ref.to_event(signer).await?); |
| 668 | send_events( | 668 | let _ = send_events( |
| 669 | client, | 669 | client, |
| 670 | Some(git_repo_path), | 670 | Some(git_repo_path), |
| 671 | new_grasp_server_events, | 671 | new_grasp_server_events, |