upleb.uk

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

summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDanConwayDev <DanConwayDev@protonmail.com>2026-02-20 21:14:45 +0000
committerDanConwayDev <DanConwayDev@protonmail.com>2026-02-20 21:21:52 +0000
commitb10340cb00a00da07d0ae735796d83801454779e (patch)
tree771671bf25ae2b7d13369490fefc5f55631de5ea /src
parentfa99cf7dfc9e6b16e67afe03873486039263ce42 (diff)
use trusted maintainer's grasp servers as fallback for co-maintainers
when a co-maintainer has no grasp servers of their own, fall back to the trusted maintainer's grasp servers rather than jumping straight to system defaults. if the trusted maintainer only uses a single grasp server, the first system default is appended for redundancy. system defaults are only used when neither the user nor the trusted maintainer has any grasp servers configured.
Diffstat (limited to 'src')
-rw-r--r--src/bin/ngit/sub_commands/init.rs15
-rw-r--r--src/lib/accept_maintainership.rs53
2 files changed, 55 insertions, 13 deletions
diff --git a/src/bin/ngit/sub_commands/init.rs b/src/bin/ngit/sub_commands/init.rs
index 5c43e6e..5ff57d5 100644
--- a/src/bin/ngit/sub_commands/init.rs
+++ b/src/bin/ngit/sub_commands/init.rs
@@ -282,12 +282,23 @@ fn resolve_grasp_servers(
282 282
283 if !interactive || cli.defaults || state.has_coordinate() || cli.force { 283 if !interactive || cli.defaults || state.has_coordinate() || cli.force {
284 // Prefer grasp servers from my existing announcement, then user's grasp 284 // Prefer grasp servers from my existing announcement, then user's grasp
285 // list, then system fallbacks 285 // list (or trusted maintainer's servers as fallback), then system defaults
286 let existing = detect_existing_grasp_servers(my_ref.as_ref(), &args.relay, &[], identifier); 286 let existing = detect_existing_grasp_servers(my_ref.as_ref(), &args.relay, &[], identifier);
287 if !existing.is_empty() { 287 if !existing.is_empty() {
288 return Ok(existing); 288 return Ok(existing);
289 } 289 }
290 return Ok(grasp_servers_from_user_or_fallback(user_ref, client)); 290 // For co-maintainer state, pass the repo_ref so the trusted
291 // maintainer's grasp servers can be used as a fallback.
292 let trusted_maintainer_repo_ref = if matches!(state, InitState::CoMaintainer { .. }) {
293 state.repo_ref()
294 } else {
295 None
296 };
297 return Ok(grasp_servers_from_user_or_fallback(
298 user_ref,
299 trusted_maintainer_repo_ref,
300 client,
301 ));
291 } 302 }
292 303
293 // Interactive prompt 304 // Interactive prompt
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// ---------------------------------------------------------------------------