diff options
| author | DanConwayDev <DanConwayDev@protonmail.com> | 2024-08-01 11:09:51 +0100 |
|---|---|---|
| committer | DanConwayDev <DanConwayDev@protonmail.com> | 2024-08-01 11:09:51 +0100 |
| commit | 640fb41902c140a63f46b6126d17416b7dccf344 (patch) | |
| tree | 821005c6a78a320f19730c076851963ce272cc1d /src/git_remote_helper.rs | |
| parent | 24125936adb6c152cdb16d55f2639dd374dfee1d (diff) | |
feat(remote): `fetch` fallsback to other servers
listed in the announcement `clone` tag
Diffstat (limited to 'src/git_remote_helper.rs')
| -rw-r--r-- | src/git_remote_helper.rs | 35 |
1 files changed, 28 insertions, 7 deletions
diff --git a/src/git_remote_helper.rs b/src/git_remote_helper.rs index d0c0005..7b471b1 100644 --- a/src/git_remote_helper.rs +++ b/src/git_remote_helper.rs | |||
| @@ -183,15 +183,36 @@ async fn list(git_repo: &Repo, repo_ref: &RepoRef, for_push: bool) -> Result<()> | |||
| 183 | } | 183 | } |
| 184 | 184 | ||
| 185 | fn fetch(git_repo: &Repository, repo_ref: &RepoRef, stdin: &Stdin, oid: &str) -> Result<()> { | 185 | fn fetch(git_repo: &Repository, repo_ref: &RepoRef, stdin: &Stdin, oid: &str) -> Result<()> { |
| 186 | let git_server_remote_url = repo_ref | 186 | let oids = get_oids_from_fetch_batch(stdin, oid)?; |
| 187 | .git_server | 187 | |
| 188 | .first() | 188 | let mut errors = HashMap::new(); |
| 189 | .context("no git server listed in nostr repository announcement")?; | 189 | for git_server_url in &repo_ref.git_server { |
| 190 | let mut git_server_remote = git_repo.remote_anonymous(git_server_remote_url)?; | 190 | if let Err(e) = fetch_from_git_server(git_repo, &oids, git_server_url) { |
| 191 | errors.insert(git_server_url.to_string(), e); | ||
| 192 | } else { | ||
| 193 | println!(); | ||
| 194 | return Ok(()); | ||
| 195 | } | ||
| 196 | } | ||
| 197 | bail!( | ||
| 198 | "failed to fetch objects in nostr state event from:\r\n{}", | ||
| 199 | errors | ||
| 200 | .iter() | ||
| 201 | .map(|(url, error)| format!("{url}: {error}")) | ||
| 202 | .collect::<Vec<String>>() | ||
| 203 | .join("\r\n") | ||
| 204 | ); | ||
| 205 | } | ||
| 206 | |||
| 207 | fn fetch_from_git_server( | ||
| 208 | git_repo: &Repository, | ||
| 209 | oids: &[String], | ||
| 210 | git_server_url: &str, | ||
| 211 | ) -> Result<()> { | ||
| 212 | let mut git_server_remote = git_repo.remote_anonymous(git_server_url)?; | ||
| 191 | git_server_remote.connect(git2::Direction::Fetch)?; | 213 | git_server_remote.connect(git2::Direction::Fetch)?; |
| 192 | git_server_remote.download(&get_oids_from_fetch_batch(stdin, oid)?, None)?; | 214 | git_server_remote.download(oids, None)?; |
| 193 | git_server_remote.disconnect()?; | 215 | git_server_remote.disconnect()?; |
| 194 | println!(); | ||
| 195 | Ok(()) | 216 | Ok(()) |
| 196 | } | 217 | } |
| 197 | 218 | ||