diff options
Diffstat (limited to 'src/lib/list.rs')
| -rw-r--r-- | src/lib/list.rs | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/src/lib/list.rs b/src/lib/list.rs index b867858..639140e 100644 --- a/src/lib/list.rs +++ b/src/lib/list.rs | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | use std::collections::HashMap; | 1 | use std::{collections::HashMap, path::PathBuf, str::FromStr}; |
| 2 | 2 | ||
| 3 | use anyhow::{Result, anyhow}; | 3 | use anyhow::{Result, anyhow}; |
| 4 | use auth_git2::GitAuthenticator; | 4 | use auth_git2::GitAuthenticator; |
| @@ -59,10 +59,12 @@ pub fn list_from_remote( | |||
| 59 | .as_str(), | 59 | .as_str(), |
| 60 | )?; | 60 | )?; |
| 61 | 61 | ||
| 62 | let formatted_url = server_url.format_as(protocol, &decoded_nostr_url.user)?; | 62 | let formatted_url = server_url.format_as(protocol)?; |
| 63 | |||
| 63 | let res = list_from_remote_url( | 64 | let res = list_from_remote_url( |
| 64 | git_repo, | 65 | git_repo, |
| 65 | &formatted_url, | 66 | &formatted_url, |
| 67 | decoded_nostr_url.ssh_key_file_path().as_ref(), | ||
| 66 | [ServerProtocol::UnauthHttps, ServerProtocol::UnauthHttp].contains(protocol), | 68 | [ServerProtocol::UnauthHttps, ServerProtocol::UnauthHttp].contains(protocol), |
| 67 | term, | 69 | term, |
| 68 | ); | 70 | ); |
| @@ -86,9 +88,18 @@ pub fn list_from_remote( | |||
| 86 | } | 88 | } |
| 87 | Err(error) => { | 89 | Err(error) => { |
| 88 | term.clear_last_lines(1)?; | 90 | term.clear_last_lines(1)?; |
| 89 | term.write_line( | 91 | term.write_line(&format!( |
| 90 | format!("list: {formatted_url} failed over {protocol}: {error}").as_str(), | 92 | "list: {formatted_url} failed over {protocol}{}: {error}", |
| 91 | )?; | 93 | if protocol == &ServerProtocol::Ssh { |
| 94 | if let Some(ssh_key_file) = &decoded_nostr_url.ssh_key_file_path() { | ||
| 95 | format!(" with ssh key from {ssh_key_file}") | ||
| 96 | } else { | ||
| 97 | String::new() | ||
| 98 | } | ||
| 99 | } else { | ||
| 100 | String::new() | ||
| 101 | } | ||
| 102 | ))?; | ||
| 92 | failed_protocols.push(protocol); | 103 | failed_protocols.push(protocol); |
| 93 | } | 104 | } |
| 94 | } | 105 | } |
| @@ -117,6 +128,7 @@ pub fn list_from_remote( | |||
| 117 | fn list_from_remote_url( | 128 | fn list_from_remote_url( |
| 118 | git_repo: &Repo, | 129 | git_repo: &Repo, |
| 119 | git_server_remote_url: &str, | 130 | git_server_remote_url: &str, |
| 131 | ssh_key_file: Option<&String>, | ||
| 120 | dont_authenticate: bool, | 132 | dont_authenticate: bool, |
| 121 | term: &console::Term, | 133 | term: &console::Term, |
| 122 | ) -> Result<HashMap<String, String>> { | 134 | ) -> Result<HashMap<String, String>> { |
| @@ -124,7 +136,20 @@ fn list_from_remote_url( | |||
| 124 | 136 | ||
| 125 | let mut git_server_remote = git_repo.git_repo.remote_anonymous(git_server_remote_url)?; | 137 | let mut git_server_remote = git_repo.git_repo.remote_anonymous(git_server_remote_url)?; |
| 126 | // authentication may be required | 138 | // authentication may be required |
| 127 | let auth = GitAuthenticator::default(); | 139 | let auth = { |
| 140 | if dont_authenticate { | ||
| 141 | GitAuthenticator::default() | ||
| 142 | } else if git_server_remote_url.contains("git@") { | ||
| 143 | if let Some(ssh_key_file) = ssh_key_file { | ||
| 144 | GitAuthenticator::default() | ||
| 145 | .add_ssh_key_from_file(PathBuf::from_str(ssh_key_file)?, None) | ||
| 146 | } else { | ||
| 147 | GitAuthenticator::default() | ||
| 148 | } | ||
| 149 | } else { | ||
| 150 | GitAuthenticator::default() | ||
| 151 | } | ||
| 152 | }; | ||
| 128 | let mut remote_callbacks = git2::RemoteCallbacks::new(); | 153 | let mut remote_callbacks = git2::RemoteCallbacks::new(); |
| 129 | if !dont_authenticate { | 154 | if !dont_authenticate { |
| 130 | remote_callbacks.credentials(auth.credentials(&git_config)); | 155 | remote_callbacks.credentials(auth.credentials(&git_config)); |