upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/src/lib/repo_ref.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/repo_ref.rs')
-rw-r--r--src/lib/repo_ref.rs65
1 files changed, 65 insertions, 0 deletions
diff --git a/src/lib/repo_ref.rs b/src/lib/repo_ref.rs
index 9573238..c0f9136 100644
--- a/src/lib/repo_ref.rs
+++ b/src/lib/repo_ref.rs
@@ -814,6 +814,71 @@ pub fn format_grasp_server_url_as_clone_url(
814 )) 814 ))
815} 815}
816 816
817/// Find the latest announcement event (by `created_at`) across all maintainer
818/// events and parse it into a `RepoRef` for shared metadata (name, description,
819/// web, etc.).
820pub fn latest_event_repo_ref(repo_ref: &RepoRef) -> Option<RepoRef> {
821 repo_ref
822 .events
823 .values()
824 .max_by_key(|e| e.created_at)
825 .and_then(|e| RepoRef::try_from((e.clone(), None)).ok())
826}
827
828/// Derive clone-URLs and relay URLs from selected grasp servers.
829///
830/// For each grasp server, adds or replaces the corresponding clone URL in
831/// `git_servers` and prepends a relay URL in `relays`. Grasp-derived
832/// infrastructure always takes priority — the other lists contain *additional*
833/// infrastructure beyond what grasp servers provide.
834pub fn apply_grasp_infrastructure(
835 grasp_servers: &[String],
836 git_servers: &mut Vec<String>,
837 relays: &mut Vec<String>,
838 public_key: &PublicKey,
839 identifier: &str,
840) -> Result<()> {
841 for (grasp_relay_insert_idx, grasp_server) in grasp_servers.iter().enumerate() {
842 // Always add grasp-derived clone URL
843 let clone_url = format_grasp_server_url_as_clone_url(grasp_server, public_key, identifier)?;
844
845 let grasp_server_clone_root = if clone_url.contains("https://") {
846 format!("https://{grasp_server}")
847 } else {
848 grasp_server.to_string()
849 };
850
851 let matching_positions: Vec<usize> = git_servers
852 .iter()
853 .enumerate()
854 .filter_map(|(idx, url)| {
855 if url.contains(&grasp_server_clone_root) {
856 Some(idx)
857 } else {
858 None
859 }
860 })
861 .collect();
862
863 if matching_positions.is_empty() {
864 git_servers.push(clone_url);
865 } else {
866 git_servers[matching_positions[0]] = clone_url;
867 for &position in matching_positions.iter().skip(1).rev() {
868 git_servers.remove(position);
869 }
870 }
871
872 // Prepend grasp-derived relay in order (for relay hint) so that the
873 // first grasp server in the list ends up at relays[0].
874 let relay_url = format_grasp_server_url_as_relay_url(grasp_server)?;
875 if !relays.contains(&relay_url) {
876 relays.insert(grasp_relay_insert_idx, relay_url);
877 }
878 }
879 Ok(())
880}
881
817#[cfg(test)] 882#[cfg(test)]
818mod tests { 883mod tests {
819 use test_utils::*; 884 use test_utils::*;