diff options
| author | DanConwayDev <DanConwayDev@protonmail.com> | 2024-12-03 15:29:06 +0000 |
|---|---|---|
| committer | DanConwayDev <DanConwayDev@protonmail.com> | 2024-12-03 15:29:06 +0000 |
| commit | d2478dbca6c5d3f61331ceabe20c6d9315cd6840 (patch) | |
| tree | 9cd79f52ac96378ef68b4798db48ee65839d9f74 /src/lib/git | |
| parent | 79f55ad6488ddb628438580acf54a1d23a990cb3 (diff) | |
refactor: limit fetch to 1 trusted coordinate
previously fetch supported fetching multiple trusted coordinates at
once. The additional complexity trade off isn't worth it.
It will still fetch events related to the coordinates of maintainers
that the trusted maintainer lists.
A scenario where there might be multiple trusted coordinates is
where a large repo is split into multiple nostr repos to manage
pull requests and issues in seperate sub-units. I might therefore
have different remotes that target different identifiers.
There also might be different set of maintainers groups that are
have different views on the latest state of the same codebase and
they haven't split off into using different identifiers.
Its simplier ngit to fetch these different nostr repos independantly
when requested. git-remote-nostr will do this automatically as it
works through remotes but for ngit cmds a further change is required
so `get_repo_coordinates` and `try_and_get_repo_coordinates` prompts
to select the desired one.
Diffstat (limited to 'src/lib/git')
| -rw-r--r-- | src/lib/git/nostr_url.rs | 72 |
1 files changed, 34 insertions, 38 deletions
diff --git a/src/lib/git/nostr_url.rs b/src/lib/git/nostr_url.rs index a501765..c26bb2e 100644 --- a/src/lib/git/nostr_url.rs +++ b/src/lib/git/nostr_url.rs | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | use core::fmt; | 1 | use core::fmt; |
| 2 | use std::{collections::HashSet, str::FromStr}; | 2 | use std::str::FromStr; |
| 3 | 3 | ||
| 4 | use anyhow::{anyhow, bail, Context, Error, Result}; | 4 | use anyhow::{anyhow, bail, Context, Error, Result}; |
| 5 | use nostr::nips::nip01::Coordinate; | 5 | use nostr::nips::nip01::Coordinate; |
| @@ -56,7 +56,7 @@ impl FromStr for ServerProtocol { | |||
| 56 | #[derive(Debug, PartialEq)] | 56 | #[derive(Debug, PartialEq)] |
| 57 | pub struct NostrUrlDecoded { | 57 | pub struct NostrUrlDecoded { |
| 58 | pub original_string: String, | 58 | pub original_string: String, |
| 59 | pub coordinates: HashSet<Coordinate>, | 59 | pub coordinate: Coordinate, |
| 60 | pub protocol: Option<ServerProtocol>, | 60 | pub protocol: Option<ServerProtocol>, |
| 61 | pub user: Option<String>, | 61 | pub user: Option<String>, |
| 62 | } | 62 | } |
| @@ -70,9 +70,8 @@ impl fmt::Display for NostrUrlDecoded { | |||
| 70 | if let Some(protocol) = &self.protocol { | 70 | if let Some(protocol) = &self.protocol { |
| 71 | write!(f, "{}/", protocol)?; | 71 | write!(f, "{}/", protocol)?; |
| 72 | } | 72 | } |
| 73 | let c = self.coordinates.iter().next().unwrap(); | 73 | write!(f, "{}/", self.coordinate.public_key.to_bech32().unwrap())?; |
| 74 | write!(f, "{}/", c.public_key.to_bech32().unwrap())?; | 74 | if let Some(relay) = self.coordinate.relays.first() { |
| 75 | if let Some(relay) = c.relays.first() { | ||
| 76 | write!( | 75 | write!( |
| 77 | f, | 76 | f, |
| 78 | "{}/", | 77 | "{}/", |
| @@ -84,7 +83,7 @@ impl fmt::Display for NostrUrlDecoded { | |||
| 84 | ) | 83 | ) |
| 85 | )?; | 84 | )?; |
| 86 | } | 85 | } |
| 87 | write!(f, "{}", c.identifier) | 86 | write!(f, "{}", self.coordinate.identifier) |
| 88 | } | 87 | } |
| 89 | } | 88 | } |
| 90 | 89 | ||
| @@ -94,7 +93,6 @@ impl std::str::FromStr for NostrUrlDecoded { | |||
| 94 | type Err = anyhow::Error; | 93 | type Err = anyhow::Error; |
| 95 | 94 | ||
| 96 | fn from_str(url: &str) -> Result<Self> { | 95 | fn from_str(url: &str) -> Result<Self> { |
| 97 | let mut coordinates = HashSet::new(); | ||
| 98 | let mut protocol = None; | 96 | let mut protocol = None; |
| 99 | let mut user = None; | 97 | let mut user = None; |
| 100 | let mut relays = vec![]; | 98 | let mut relays = vec![]; |
| @@ -157,9 +155,9 @@ impl std::str::FromStr for NostrUrlDecoded { | |||
| 157 | // extract naddr npub/<optional-relays>/identifer | 155 | // extract naddr npub/<optional-relays>/identifer |
| 158 | let part = parts.first().context(INCORRECT_NOSTR_URL_FORMAT_ERROR)?; | 156 | let part = parts.first().context(INCORRECT_NOSTR_URL_FORMAT_ERROR)?; |
| 159 | // naddr used | 157 | // naddr used |
| 160 | if let Ok(coordinate) = Coordinate::parse(part) { | 158 | let coordinate = if let Ok(coordinate) = Coordinate::parse(part) { |
| 161 | if coordinate.kind.eq(&nostr_sdk::Kind::GitRepoAnnouncement) { | 159 | if coordinate.kind.eq(&nostr_sdk::Kind::GitRepoAnnouncement) { |
| 162 | coordinates.insert(coordinate); | 160 | coordinate |
| 163 | } else { | 161 | } else { |
| 164 | bail!("naddr doesnt point to a git repository announcement"); | 162 | bail!("naddr doesnt point to a git repository announcement"); |
| 165 | } | 163 | } |
| @@ -181,19 +179,19 @@ impl std::str::FromStr for NostrUrlDecoded { | |||
| 181 | RelayUrl::parse(&decoded).context("could not parse relays in nostr git url")?; | 179 | RelayUrl::parse(&decoded).context("could not parse relays in nostr git url")?; |
| 182 | relays.push(url); | 180 | relays.push(url); |
| 183 | } | 181 | } |
| 184 | coordinates.insert(Coordinate { | 182 | Coordinate { |
| 185 | identifier, | 183 | identifier, |
| 186 | public_key, | 184 | public_key, |
| 187 | kind: nostr_sdk::Kind::GitRepoAnnouncement, | 185 | kind: nostr_sdk::Kind::GitRepoAnnouncement, |
| 188 | relays, | 186 | relays, |
| 189 | }); | 187 | } |
| 190 | } else { | 188 | } else { |
| 191 | bail!(INCORRECT_NOSTR_URL_FORMAT_ERROR); | 189 | bail!(INCORRECT_NOSTR_URL_FORMAT_ERROR); |
| 192 | } | 190 | }; |
| 193 | 191 | ||
| 194 | Ok(Self { | 192 | Ok(Self { |
| 195 | original_string: url.to_string(), | 193 | original_string: url.to_string(), |
| 196 | coordinates, | 194 | coordinate, |
| 197 | protocol, | 195 | protocol, |
| 198 | user, | 196 | user, |
| 199 | }) | 197 | }) |
| @@ -865,8 +863,6 @@ mod tests { | |||
| 865 | } | 863 | } |
| 866 | } | 864 | } |
| 867 | mod nostr_git_url_format { | 865 | mod nostr_git_url_format { |
| 868 | use std::collections::HashSet; | ||
| 869 | |||
| 870 | use nostr::nips::nip01::Coordinate; | 866 | use nostr::nips::nip01::Coordinate; |
| 871 | use nostr_sdk::PublicKey; | 867 | use nostr_sdk::PublicKey; |
| 872 | 868 | ||
| @@ -880,7 +876,7 @@ mod tests { | |||
| 880 | "{}", | 876 | "{}", |
| 881 | NostrUrlDecoded { | 877 | NostrUrlDecoded { |
| 882 | original_string: String::new(), | 878 | original_string: String::new(), |
| 883 | coordinates: HashSet::from_iter(vec![Coordinate { | 879 | coordinate: Coordinate { |
| 884 | identifier: "ngit".to_string(), | 880 | identifier: "ngit".to_string(), |
| 885 | public_key: PublicKey::parse( | 881 | public_key: PublicKey::parse( |
| 886 | "npub15qydau2hjma6ngxkl2cyar74wzyjshvl65za5k5rl69264ar2exs5cyejr", | 882 | "npub15qydau2hjma6ngxkl2cyar74wzyjshvl65za5k5rl69264ar2exs5cyejr", |
| @@ -888,7 +884,7 @@ mod tests { | |||
| 888 | .unwrap(), | 884 | .unwrap(), |
| 889 | kind: nostr_sdk::Kind::GitRepoAnnouncement, | 885 | kind: nostr_sdk::Kind::GitRepoAnnouncement, |
| 890 | relays: vec![RelayUrl::parse("wss://nos.lol").unwrap()], | 886 | relays: vec![RelayUrl::parse("wss://nos.lol").unwrap()], |
| 891 | }]), | 887 | }, |
| 892 | protocol: None, | 888 | protocol: None, |
| 893 | user: None, | 889 | user: None, |
| 894 | } | 890 | } |
| @@ -905,7 +901,7 @@ mod tests { | |||
| 905 | "{}", | 901 | "{}", |
| 906 | NostrUrlDecoded { | 902 | NostrUrlDecoded { |
| 907 | original_string: String::new(), | 903 | original_string: String::new(), |
| 908 | coordinates: HashSet::from_iter(vec![Coordinate { | 904 | coordinate: Coordinate { |
| 909 | identifier: "ngit".to_string(), | 905 | identifier: "ngit".to_string(), |
| 910 | public_key: PublicKey::parse( | 906 | public_key: PublicKey::parse( |
| 911 | "npub15qydau2hjma6ngxkl2cyar74wzyjshvl65za5k5rl69264ar2exs5cyejr", | 907 | "npub15qydau2hjma6ngxkl2cyar74wzyjshvl65za5k5rl69264ar2exs5cyejr", |
| @@ -913,7 +909,7 @@ mod tests { | |||
| 913 | .unwrap(), | 909 | .unwrap(), |
| 914 | kind: nostr_sdk::Kind::GitRepoAnnouncement, | 910 | kind: nostr_sdk::Kind::GitRepoAnnouncement, |
| 915 | relays: vec![], | 911 | relays: vec![], |
| 916 | }]), | 912 | }, |
| 917 | protocol: None, | 913 | protocol: None, |
| 918 | user: None, | 914 | user: None, |
| 919 | } | 915 | } |
| @@ -930,7 +926,7 @@ mod tests { | |||
| 930 | "{}", | 926 | "{}", |
| 931 | NostrUrlDecoded { | 927 | NostrUrlDecoded { |
| 932 | original_string: String::new(), | 928 | original_string: String::new(), |
| 933 | coordinates: HashSet::from_iter(vec![Coordinate { | 929 | coordinate: Coordinate { |
| 934 | identifier: "ngit".to_string(), | 930 | identifier: "ngit".to_string(), |
| 935 | public_key: PublicKey::parse( | 931 | public_key: PublicKey::parse( |
| 936 | "npub15qydau2hjma6ngxkl2cyar74wzyjshvl65za5k5rl69264ar2exs5cyejr", | 932 | "npub15qydau2hjma6ngxkl2cyar74wzyjshvl65za5k5rl69264ar2exs5cyejr", |
| @@ -938,7 +934,7 @@ mod tests { | |||
| 938 | .unwrap(), | 934 | .unwrap(), |
| 939 | kind: nostr_sdk::Kind::GitRepoAnnouncement, | 935 | kind: nostr_sdk::Kind::GitRepoAnnouncement, |
| 940 | relays: vec![RelayUrl::parse("wss://nos.lol").unwrap()], | 936 | relays: vec![RelayUrl::parse("wss://nos.lol").unwrap()], |
| 941 | }]), | 937 | }, |
| 942 | protocol: Some(ServerProtocol::Ssh), | 938 | protocol: Some(ServerProtocol::Ssh), |
| 943 | user: None, | 939 | user: None, |
| 944 | } | 940 | } |
| @@ -955,7 +951,7 @@ mod tests { | |||
| 955 | "{}", | 951 | "{}", |
| 956 | NostrUrlDecoded { | 952 | NostrUrlDecoded { |
| 957 | original_string: String::new(), | 953 | original_string: String::new(), |
| 958 | coordinates: HashSet::from_iter(vec![Coordinate { | 954 | coordinate: Coordinate { |
| 959 | identifier: "ngit".to_string(), | 955 | identifier: "ngit".to_string(), |
| 960 | public_key: PublicKey::parse( | 956 | public_key: PublicKey::parse( |
| 961 | "npub15qydau2hjma6ngxkl2cyar74wzyjshvl65za5k5rl69264ar2exs5cyejr", | 957 | "npub15qydau2hjma6ngxkl2cyar74wzyjshvl65za5k5rl69264ar2exs5cyejr", |
| @@ -963,7 +959,7 @@ mod tests { | |||
| 963 | .unwrap(), | 959 | .unwrap(), |
| 964 | kind: nostr_sdk::Kind::GitRepoAnnouncement, | 960 | kind: nostr_sdk::Kind::GitRepoAnnouncement, |
| 965 | relays: vec![RelayUrl::parse("wss://nos.lol").unwrap()], | 961 | relays: vec![RelayUrl::parse("wss://nos.lol").unwrap()], |
| 966 | }]), | 962 | }, |
| 967 | protocol: Some(ServerProtocol::Ssh), | 963 | protocol: Some(ServerProtocol::Ssh), |
| 968 | user: Some("bla".to_string()), | 964 | user: Some("bla".to_string()), |
| 969 | } | 965 | } |
| @@ -1002,7 +998,7 @@ mod tests { | |||
| 1002 | NostrUrlDecoded::from_str(&url)?, | 998 | NostrUrlDecoded::from_str(&url)?, |
| 1003 | NostrUrlDecoded { | 999 | NostrUrlDecoded { |
| 1004 | original_string: url.clone(), | 1000 | original_string: url.clone(), |
| 1005 | coordinates: HashSet::from([Coordinate { | 1001 | coordinate: Coordinate { |
| 1006 | identifier: "ngit".to_string(), | 1002 | identifier: "ngit".to_string(), |
| 1007 | public_key: PublicKey::parse( | 1003 | public_key: PublicKey::parse( |
| 1008 | "npub15qydau2hjma6ngxkl2cyar74wzyjshvl65za5k5rl69264ar2exs5cyejr", | 1004 | "npub15qydau2hjma6ngxkl2cyar74wzyjshvl65za5k5rl69264ar2exs5cyejr", |
| @@ -1011,7 +1007,7 @@ mod tests { | |||
| 1011 | kind: nostr_sdk::Kind::GitRepoAnnouncement, | 1007 | kind: nostr_sdk::Kind::GitRepoAnnouncement, |
| 1012 | relays: vec![RelayUrl::parse("wss://nos.lol").unwrap()], /* wont add the | 1008 | relays: vec![RelayUrl::parse("wss://nos.lol").unwrap()], /* wont add the |
| 1013 | * slash */ | 1009 | * slash */ |
| 1014 | }]), | 1010 | }, |
| 1015 | protocol: None, | 1011 | protocol: None, |
| 1016 | user: None, | 1012 | user: None, |
| 1017 | }, | 1013 | }, |
| @@ -1031,7 +1027,7 @@ mod tests { | |||
| 1031 | NostrUrlDecoded::from_str(&url)?, | 1027 | NostrUrlDecoded::from_str(&url)?, |
| 1032 | NostrUrlDecoded { | 1028 | NostrUrlDecoded { |
| 1033 | original_string: url.clone(), | 1029 | original_string: url.clone(), |
| 1034 | coordinates: HashSet::from([get_model_coordinate(false)]), | 1030 | coordinate: get_model_coordinate(false), |
| 1035 | protocol: None, | 1031 | protocol: None, |
| 1036 | user: None, | 1032 | user: None, |
| 1037 | }, | 1033 | }, |
| @@ -1049,7 +1045,7 @@ mod tests { | |||
| 1049 | NostrUrlDecoded::from_str(&url)?, | 1045 | NostrUrlDecoded::from_str(&url)?, |
| 1050 | NostrUrlDecoded { | 1046 | NostrUrlDecoded { |
| 1051 | original_string: url.clone(), | 1047 | original_string: url.clone(), |
| 1052 | coordinates: HashSet::from([get_model_coordinate(true)]), | 1048 | coordinate: get_model_coordinate(true), |
| 1053 | protocol: None, | 1049 | protocol: None, |
| 1054 | user: None, | 1050 | user: None, |
| 1055 | }, | 1051 | }, |
| @@ -1067,7 +1063,7 @@ mod tests { | |||
| 1067 | NostrUrlDecoded::from_str(&url)?, | 1063 | NostrUrlDecoded::from_str(&url)?, |
| 1068 | NostrUrlDecoded { | 1064 | NostrUrlDecoded { |
| 1069 | original_string: url.clone(), | 1065 | original_string: url.clone(), |
| 1070 | coordinates: HashSet::from([get_model_coordinate(true)]), | 1066 | coordinate: get_model_coordinate(true), |
| 1071 | protocol: None, | 1067 | protocol: None, |
| 1072 | user: None, | 1068 | user: None, |
| 1073 | }, | 1069 | }, |
| @@ -1086,7 +1082,7 @@ mod tests { | |||
| 1086 | NostrUrlDecoded::from_str(&url)?, | 1082 | NostrUrlDecoded::from_str(&url)?, |
| 1087 | NostrUrlDecoded { | 1083 | NostrUrlDecoded { |
| 1088 | original_string: url.clone(), | 1084 | original_string: url.clone(), |
| 1089 | coordinates: HashSet::from([Coordinate { | 1085 | coordinate: Coordinate { |
| 1090 | identifier: "ngit".to_string(), | 1086 | identifier: "ngit".to_string(), |
| 1091 | public_key: PublicKey::parse( | 1087 | public_key: PublicKey::parse( |
| 1092 | "npub15qydau2hjma6ngxkl2cyar74wzyjshvl65za5k5rl69264ar2exs5cyejr", | 1088 | "npub15qydau2hjma6ngxkl2cyar74wzyjshvl65za5k5rl69264ar2exs5cyejr", |
| @@ -1097,7 +1093,7 @@ mod tests { | |||
| 1097 | RelayUrl::parse("wss://nos.lol/").unwrap(), | 1093 | RelayUrl::parse("wss://nos.lol/").unwrap(), |
| 1098 | RelayUrl::parse("wss://relay.damus.io/").unwrap(), | 1094 | RelayUrl::parse("wss://relay.damus.io/").unwrap(), |
| 1099 | ], | 1095 | ], |
| 1100 | }]), | 1096 | }, |
| 1101 | protocol: None, | 1097 | protocol: None, |
| 1102 | user: None, | 1098 | user: None, |
| 1103 | }, | 1099 | }, |
| @@ -1112,7 +1108,7 @@ mod tests { | |||
| 1112 | NostrUrlDecoded::from_str(&url)?, | 1108 | NostrUrlDecoded::from_str(&url)?, |
| 1113 | NostrUrlDecoded { | 1109 | NostrUrlDecoded { |
| 1114 | original_string: url.clone(), | 1110 | original_string: url.clone(), |
| 1115 | coordinates: HashSet::from([get_model_coordinate(false)]), | 1111 | coordinate: get_model_coordinate(false), |
| 1116 | protocol: Some(ServerProtocol::Ssh), | 1112 | protocol: Some(ServerProtocol::Ssh), |
| 1117 | user: None, | 1113 | user: None, |
| 1118 | }, | 1114 | }, |
| @@ -1127,7 +1123,7 @@ mod tests { | |||
| 1127 | NostrUrlDecoded::from_str(&url)?, | 1123 | NostrUrlDecoded::from_str(&url)?, |
| 1128 | NostrUrlDecoded { | 1124 | NostrUrlDecoded { |
| 1129 | original_string: url.clone(), | 1125 | original_string: url.clone(), |
| 1130 | coordinates: HashSet::from([get_model_coordinate(false)]), | 1126 | coordinate: get_model_coordinate(false), |
| 1131 | protocol: Some(ServerProtocol::Ssh), | 1127 | protocol: Some(ServerProtocol::Ssh), |
| 1132 | user: Some("fred".to_string()), | 1128 | user: Some("fred".to_string()), |
| 1133 | }, | 1129 | }, |
| @@ -1146,7 +1142,7 @@ mod tests { | |||
| 1146 | NostrUrlDecoded::from_str(&url)?, | 1142 | NostrUrlDecoded::from_str(&url)?, |
| 1147 | NostrUrlDecoded { | 1143 | NostrUrlDecoded { |
| 1148 | original_string: url.clone(), | 1144 | original_string: url.clone(), |
| 1149 | coordinates: HashSet::from([get_model_coordinate(true)]), | 1145 | coordinate: get_model_coordinate(true), |
| 1150 | protocol: None, | 1146 | protocol: None, |
| 1151 | user: None, | 1147 | user: None, |
| 1152 | }, | 1148 | }, |
| @@ -1164,7 +1160,7 @@ mod tests { | |||
| 1164 | NostrUrlDecoded::from_str(&url)?, | 1160 | NostrUrlDecoded::from_str(&url)?, |
| 1165 | NostrUrlDecoded { | 1161 | NostrUrlDecoded { |
| 1166 | original_string: url.clone(), | 1162 | original_string: url.clone(), |
| 1167 | coordinates: HashSet::from([get_model_coordinate(true)]), | 1163 | coordinate: get_model_coordinate(true), |
| 1168 | protocol: None, | 1164 | protocol: None, |
| 1169 | user: None, | 1165 | user: None, |
| 1170 | }, | 1166 | }, |
| @@ -1183,7 +1179,7 @@ mod tests { | |||
| 1183 | NostrUrlDecoded::from_str(&url)?, | 1179 | NostrUrlDecoded::from_str(&url)?, |
| 1184 | NostrUrlDecoded { | 1180 | NostrUrlDecoded { |
| 1185 | original_string: url.clone(), | 1181 | original_string: url.clone(), |
| 1186 | coordinates: HashSet::from([Coordinate { | 1182 | coordinate: Coordinate { |
| 1187 | identifier: "ngit".to_string(), | 1183 | identifier: "ngit".to_string(), |
| 1188 | public_key: PublicKey::parse( | 1184 | public_key: PublicKey::parse( |
| 1189 | "npub15qydau2hjma6ngxkl2cyar74wzyjshvl65za5k5rl69264ar2exs5cyejr", | 1185 | "npub15qydau2hjma6ngxkl2cyar74wzyjshvl65za5k5rl69264ar2exs5cyejr", |
| @@ -1194,7 +1190,7 @@ mod tests { | |||
| 1194 | RelayUrl::parse("wss://nos.lol/").unwrap(), | 1190 | RelayUrl::parse("wss://nos.lol/").unwrap(), |
| 1195 | RelayUrl::parse("wss://relay.damus.io/").unwrap(), | 1191 | RelayUrl::parse("wss://relay.damus.io/").unwrap(), |
| 1196 | ], | 1192 | ], |
| 1197 | }]), | 1193 | }, |
| 1198 | protocol: None, | 1194 | protocol: None, |
| 1199 | user: None, | 1195 | user: None, |
| 1200 | }, | 1196 | }, |
| @@ -1209,7 +1205,7 @@ mod tests { | |||
| 1209 | NostrUrlDecoded::from_str(&url)?, | 1205 | NostrUrlDecoded::from_str(&url)?, |
| 1210 | NostrUrlDecoded { | 1206 | NostrUrlDecoded { |
| 1211 | original_string: url.clone(), | 1207 | original_string: url.clone(), |
| 1212 | coordinates: HashSet::from([get_model_coordinate(false)]), | 1208 | coordinate: get_model_coordinate(false), |
| 1213 | protocol: Some(ServerProtocol::Ssh), | 1209 | protocol: Some(ServerProtocol::Ssh), |
| 1214 | user: None, | 1210 | user: None, |
| 1215 | }, | 1211 | }, |
| @@ -1224,7 +1220,7 @@ mod tests { | |||
| 1224 | NostrUrlDecoded::from_str(&url)?, | 1220 | NostrUrlDecoded::from_str(&url)?, |
| 1225 | NostrUrlDecoded { | 1221 | NostrUrlDecoded { |
| 1226 | original_string: url.clone(), | 1222 | original_string: url.clone(), |
| 1227 | coordinates: HashSet::from([get_model_coordinate(false)]), | 1223 | coordinate: get_model_coordinate(false), |
| 1228 | protocol: Some(ServerProtocol::Ssh), | 1224 | protocol: Some(ServerProtocol::Ssh), |
| 1229 | user: Some("fred".to_string()), | 1225 | user: Some("fred".to_string()), |
| 1230 | }, | 1226 | }, |