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 /src/lib | |
| 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.
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/accept_maintainership.rs | 53 |
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. | ||
| 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 | // --------------------------------------------------------------------------- |