ssh project: Handle multiple paths and worktrees correctly (#18277)
This makes SSH projects work with `ssh_connections` that have multiple paths: ```json { "ssh_connections": [ { "host": "127.0.0.1", "projects": [ { "paths": [ "/Users/thorstenball/work/projs/go-proj", "/Users/thorstenball/work/projs/rust-proj" ] } ] } ] } ``` @ConradIrwin @mikayla-maki since this wasn't really released yet, we didn't create a full-on migration, so old ssh projects that were already serialized need to either be manually deleted from the database, or the whole local DB wiped. Release Notes: - N/A --------- Co-authored-by: Bennet <bennet@zed.dev>
This commit is contained in:
parent
3a2f0653d1
commit
437bcc0ce6
4 changed files with 66 additions and 56 deletions
|
@ -26,24 +26,29 @@ pub struct SerializedSshProject {
|
|||
pub id: SshProjectId,
|
||||
pub host: String,
|
||||
pub port: Option<u16>,
|
||||
pub path: String,
|
||||
pub paths: Vec<String>,
|
||||
pub user: Option<String>,
|
||||
}
|
||||
|
||||
impl SerializedSshProject {
|
||||
pub fn ssh_url(&self) -> String {
|
||||
let mut result = String::from("ssh://");
|
||||
if let Some(user) = &self.user {
|
||||
result.push_str(user);
|
||||
result.push('@');
|
||||
}
|
||||
result.push_str(&self.host);
|
||||
if let Some(port) = &self.port {
|
||||
result.push(':');
|
||||
result.push_str(&port.to_string());
|
||||
}
|
||||
result.push_str(&self.path);
|
||||
result
|
||||
pub fn ssh_urls(&self) -> Vec<PathBuf> {
|
||||
self.paths
|
||||
.iter()
|
||||
.map(|path| {
|
||||
let mut result = String::new();
|
||||
if let Some(user) = &self.user {
|
||||
result.push_str(user);
|
||||
result.push('@');
|
||||
}
|
||||
result.push_str(&self.host);
|
||||
if let Some(port) = &self.port {
|
||||
result.push(':');
|
||||
result.push_str(&port.to_string());
|
||||
}
|
||||
result.push_str(path);
|
||||
PathBuf::from(result)
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -58,7 +63,8 @@ impl Bind for &SerializedSshProject {
|
|||
let next_index = statement.bind(&self.id.0, start_index)?;
|
||||
let next_index = statement.bind(&self.host, next_index)?;
|
||||
let next_index = statement.bind(&self.port, next_index)?;
|
||||
let next_index = statement.bind(&self.path, next_index)?;
|
||||
let raw_paths = serde_json::to_string(&self.paths)?;
|
||||
let next_index = statement.bind(&raw_paths, next_index)?;
|
||||
statement.bind(&self.user, next_index)
|
||||
}
|
||||
}
|
||||
|
@ -68,7 +74,9 @@ impl Column for SerializedSshProject {
|
|||
let id = statement.column_int64(start_index)?;
|
||||
let host = statement.column_text(start_index + 1)?.to_string();
|
||||
let (port, _) = Option::<u16>::column(statement, start_index + 2)?;
|
||||
let path = statement.column_text(start_index + 3)?.to_string();
|
||||
let raw_paths = statement.column_text(start_index + 3)?.to_string();
|
||||
let paths: Vec<String> = serde_json::from_str(&raw_paths)?;
|
||||
|
||||
let (user, _) = Option::<String>::column(statement, start_index + 4)?;
|
||||
|
||||
Ok((
|
||||
|
@ -76,7 +84,7 @@ impl Column for SerializedSshProject {
|
|||
id: SshProjectId(id as u64),
|
||||
host,
|
||||
port,
|
||||
path,
|
||||
paths,
|
||||
user,
|
||||
},
|
||||
start_index + 5,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue