upleb.uk

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

summaryrefslogtreecommitdiff
path: root/src/git_remote_helper.rs
diff options
context:
space:
mode:
authorDanConwayDev <DanConwayDev@protonmail.com>2024-08-01 11:09:51 +0100
committerDanConwayDev <DanConwayDev@protonmail.com>2024-08-01 11:09:51 +0100
commit640fb41902c140a63f46b6126d17416b7dccf344 (patch)
tree821005c6a78a320f19730c076851963ce272cc1d /src/git_remote_helper.rs
parent24125936adb6c152cdb16d55f2639dd374dfee1d (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.rs35
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
185fn fetch(git_repo: &Repository, repo_ref: &RepoRef, stdin: &Stdin, oid: &str) -> Result<()> { 185fn 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
207fn 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