upleb.uk

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

summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/accept_maintainership.rs53
1 files changed, 42 insertions, 11 deletions
diff --git a/src/lib/accept_maintainership.rs b/src/lib/accept_maintainership.rs
index 39f10cf..086b858 100644
--- a/src/lib/accept_maintainership.rs
+++ b/src/lib/accept_maintainership.rs
@@ -66,7 +66,8 @@ pub async fn accept_maintainership_with_defaults(
66 66
67 // --- Step 1: resolve infrastructure --- 67 // --- Step 1: resolve infrastructure ---
68 68
69 let selected_grasp_servers = grasp_servers_from_user_or_fallback(user_ref, client); 69 let selected_grasp_servers =
70 grasp_servers_from_user_or_fallback(user_ref, Some(repo_ref), client);
70 71
71 let mut git_servers: Vec<String> = vec![]; 72 let mut git_servers: Vec<String> = vec![];
72 let mut relay_strings: Vec<String> = vec![]; 73 let mut relay_strings: Vec<String> = vec![];
@@ -208,26 +209,56 @@ pub async fn accept_maintainership_with_defaults(
208// Grasp server helpers 209// Grasp server helpers
209// --------------------------------------------------------------------------- 210// ---------------------------------------------------------------------------
210 211
211/// Return the user's saved grasp servers, falling back to client defaults. 212/// Return grasp servers for a co-maintainer using the following priority:
213///
214/// 1. User's own saved grasp server list (if non-empty).
215/// 2. Trusted maintainer's grasp servers derived from
216/// `trusted_maintainer_repo_ref` (if provided and non-empty). If the trusted
217/// maintainer only uses a single grasp server, the first system-default
218/// grasp server is appended so the co-maintainer has at least two servers
219/// for redundancy.
220/// 3. System / client default grasp servers.
212pub fn grasp_servers_from_user_or_fallback( 221pub fn grasp_servers_from_user_or_fallback(
213 user_ref: &UserRef, 222 user_ref: &UserRef,
223 trusted_maintainer_repo_ref: Option<&RepoRef>,
214 #[cfg(test)] client: &MockConnect, 224 #[cfg(test)] client: &MockConnect,
215 #[cfg(not(test))] client: &Client, 225 #[cfg(not(test))] client: &Client,
216) -> Vec<String> { 226) -> Vec<String> {
217 if user_ref.grasp_list.urls.is_empty() { 227 // Priority 1: user's own grasp list.
218 client 228 if !user_ref.grasp_list.urls.is_empty() {
219 .get_grasp_default_set() 229 return user_ref
220 .iter()
221 .map(std::string::ToString::to_string)
222 .collect()
223 } else {
224 user_ref
225 .grasp_list 230 .grasp_list
226 .urls 231 .urls
227 .iter() 232 .iter()
228 .map(std::string::ToString::to_string) 233 .map(std::string::ToString::to_string)
229 .collect() 234 .collect();
230 } 235 }
236
237 // Priority 2: trusted maintainer's grasp servers.
238 if let Some(rr) = trusted_maintainer_repo_ref {
239 let maintainer_servers = rr.grasp_servers();
240 if !maintainer_servers.is_empty() {
241 if maintainer_servers.len() == 1 {
242 // Supplement a single server with the first system default for
243 // redundancy, avoiding duplicates.
244 let mut servers = maintainer_servers;
245 if let Some(first_default) = client.get_grasp_default_set().first() {
246 if !servers.contains(first_default) {
247 servers.push(first_default.clone());
248 }
249 }
250 return servers;
251 }
252 return maintainer_servers;
253 }
254 }
255
256 // Priority 3: system defaults.
257 client
258 .get_grasp_default_set()
259 .iter()
260 .map(std::string::ToString::to_string)
261 .collect()
231} 262}
232 263
233// --------------------------------------------------------------------------- 264// ---------------------------------------------------------------------------