From a9dc4da2329019f095e811c3837f329ecd94765b Mon Sep 17 00:00:00 2001 From: DanConwayDev Date: Wed, 21 May 2025 15:46:08 +0100 Subject: fix: preserve relay and git server order rewrite of 25e58e52624210f5852a9183495821526add5928 which took relays & git servers from all maintainer some test failed due to incorrect ordering. its better to start with the ones the trusted maintainer selected. --- src/lib/client.rs | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) (limited to 'src/lib') diff --git a/src/lib/client.rs b/src/lib/client.rs index 7cd3c46..5ba64ff 100644 --- a/src/lib/client.rs +++ b/src/lib/client.rs @@ -973,14 +973,29 @@ 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()); + // Use relays and git servers from all maintainer announcement events + // we use Vec and HashSet to remove duplicates and preserve order + let mut relays: Vec = repo_ref.relays.clone(); + let mut git_server: Vec = repo_ref.git_server.clone(); + let mut seen_relays: HashSet = HashSet::from_iter(relays.iter().cloned()); + let mut seen_git_server: HashSet = git_server + .iter() + .map(|server| server.trim_end_matches('/').to_string()) + .collect(); + 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); + for relay in m_repo_ref.relays { + if seen_relays.insert(relay.clone()) { + relays.push(relay); + } + } + for server in m_repo_ref.git_server { + if seen_git_server.insert(server.trim_end_matches('/').to_string()) { + git_server.push(server); + } + } } } } @@ -989,8 +1004,8 @@ pub async fn get_repo_ref_from_cache( // 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(), + relays, + git_server, events, ..repo_ref }) -- cgit v1.2.3