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:
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// ---------------------------------------------------------------------------