diff options
| author | DanConwayDev <DanConwayDev@protonmail.com> | 2026-02-20 21:14:45 +0000 |
|---|---|---|
| committer | DanConwayDev <DanConwayDev@protonmail.com> | 2026-02-20 21:21:52 +0000 |
| commit | b10340cb00a00da07d0ae735796d83801454779e (patch) | |
| tree | 771671bf25ae2b7d13369490fefc5f55631de5ea | |
| parent | fa99cf7dfc9e6b16e67afe03873486039263ce42 (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.
| -rw-r--r-- | src/bin/ngit/sub_commands/init.rs | 15 | ||||
| -rw-r--r-- | src/lib/accept_maintainership.rs | 53 |
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. | ||
| 212 | pub fn grasp_servers_from_user_or_fallback( | 221 | pub 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 | // --------------------------------------------------------------------------- |