diff options
Diffstat (limited to 'src/git_remote_helper.rs')
| -rw-r--r-- | src/git_remote_helper.rs | 43 |
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 | ||
| 151 | fn list(git_repo: &Repository, repo_ref: &RepoRef, for_push: bool) -> Result<()> { | 151 | async 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 | } |