From 25e58e52624210f5852a9183495821526add5928 Mon Sep 17 00:00:00 2001 From: DanConwayDev Date: Wed, 21 May 2025 11:11:49 +0100 Subject: fix: use relays & git servers from all maintainer but other details from trusted maintainer. This maximises the likelihood that all git servers and relays have the correct state. --- src/lib/client.rs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) (limited to 'src/lib/client.rs') diff --git a/src/lib/client.rs b/src/lib/client.rs index 3f2ae68..9eef777 100644 --- a/src/lib/client.rs +++ b/src/lib/client.rs @@ -858,6 +858,8 @@ pub async fn save_event_in_global_cache( } } +// use annoucement from trusted maintainer but recursively add maintainers, git +// servers and relays pub async fn get_repo_ref_from_cache( git_repo_path: Option<&Path>, repo_coordinate: &Nip19Coordinate, @@ -907,7 +909,8 @@ pub async fn get_repo_ref_from_cache( repo_events.sort_by_key(|e| e.created_at); let repo_ref = RepoRef::try_from(( repo_events - .first() + .iter() + .find(|e| e.pubkey == repo_coordinate.public_key) .context("no repo announcement event found at specified Nip19Coordinates. if you are the repository maintainer consider running `ngit init` to create one")? .clone(), Some(repo_coordinate.public_key), @@ -930,10 +933,24 @@ pub async fn get_repo_ref_from_cache( } } + // use relays and git servers from all maintainer announcement event + let mut relays: HashSet = HashSet::from_iter(repo_ref.relays.iter().cloned()); + let mut git_servers: HashSet = HashSet::from_iter(repo_ref.git_server.iter().cloned()); + for m in &maintainers { + if let Some(event) = repo_events.iter().find(|e| e.pubkey == *m) { + if let Ok(m_repo_ref) = RepoRef::try_from((event.clone(), None)) { + relays.extend(m_repo_ref.relays); + git_servers.extend(m_repo_ref.git_server); + } + } + } + Ok(RepoRef { // use all maintainers from all events found, not just maintainers in the most // recent event maintainers: maintainers.iter().copied().collect::>(), + relays: relays.into_iter().collect(), + git_server: git_servers.into_iter().collect(), events, ..repo_ref }) -- cgit v1.2.3