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 09:39:08 +0100
committerDanConwayDev <DanConwayDev@protonmail.com>2024-08-01 10:19:31 +0100
commitc494242fbf7308e50e38ed7b4750a4fe2638ed18 (patch)
tree506cbe2c95a1fc80902b665055dbeadebc644000 /src/git_remote_helper.rs
parent5c973c672f79510b19cd394a33751d93b7f9f5ee (diff)
feat(remote): `fetch` uses state event
and falls back to git server is state event cant be found
Diffstat (limited to 'src/git_remote_helper.rs')
-rw-r--r--src/git_remote_helper.rs43
1 files changed, 30 insertions, 13 deletions
diff --git a/src/git_remote_helper.rs b/src/git_remote_helper.rs
index 08a59c1..38a0aa5 100644
--- a/src/git_remote_helper.rs
+++ b/src/git_remote_helper.rs
@@ -108,10 +108,10 @@ async fn main() -> Result<()> {
108 .await?; 108 .await?;
109 } 109 }
110 ["list"] => { 110 ["list"] => {
111 list(&git_repo.git_repo, &repo_ref, false)?; 111 list(&git_repo, &repo_ref, false).await?;
112 } 112 }
113 ["list", "for-push"] => { 113 ["list", "for-push"] => {
114 list(&git_repo.git_repo, &repo_ref, true)?; 114 list(&git_repo, &repo_ref, true).await?;
115 } 115 }
116 [] => { 116 [] => {
117 return Ok(()); 117 return Ok(());
@@ -148,19 +148,36 @@ fn nostr_git_url_to_repo_coordinates(url: &str) -> Result<HashSet<Coordinate>> {
148 Ok(repo_coordinattes) 148 Ok(repo_coordinattes)
149} 149}
150 150
151fn list(git_repo: &Repository, repo_ref: &RepoRef, for_push: bool) -> Result<()> { 151async fn list(git_repo: &Repo, repo_ref: &RepoRef, for_push: bool) -> Result<()> {
152 let git_server_remote_url = repo_ref 152 if let Ok(repo_state) = get_state_from_cache(git_repo.get_path()?, repo_ref).await {
153 .git_server 153 for (name, value) in &repo_state.state {
154 .first() 154 if value.starts_with("ref: ") {
155 .context("no git server listed in nostr repository announcement")?; 155 if !for_push {
156 let mut git_server_remote = git_repo.remote_anonymous(git_server_remote_url)?; 156 println!("{} {name}", value.replace("ref: ", "@"));
157 git_server_remote.connect(git2::Direction::Fetch)?; 157 }
158 for head in git_server_remote.list()? { 158 } else {
159 if !for_push || head.name() != "HEAD" { 159 println!("{value} {name}");
160 println!("{} {}", head.oid(), head.name()); 160 }
161 } 161 }
162 } else {
163 let git_server_remote_url = repo_ref
164 .git_server
165 .first()
166 .context("no git server listed in nostr repository announcement")?;
167 let mut git_server_remote = git_repo.git_repo.remote_anonymous(git_server_remote_url)?;
168 git_server_remote.connect(git2::Direction::Fetch)?;
169
170 for head in git_server_remote.list()? {
171 if let Some(symbolic_reference) = head.symref_target() {
172 if !for_push {
173 println!("@{} {}", symbolic_reference, head.name());
174 }
175 } else {
176 println!("{} {}", head.oid(), head.name());
177 }
178 }
179 git_server_remote.disconnect()?;
162 } 180 }
163 git_server_remote.disconnect()?;
164 println!(); 181 println!();
165 Ok(()) 182 Ok(())
166} 183}