ssh lsp completions (#17665)
Release Notes: * ssh-remoting: Fixed shell environment loading for remote shells.
This commit is contained in:
parent
dea85099a2
commit
ca2cce79ed
8 changed files with 74 additions and 78 deletions
|
@ -1,10 +1,7 @@
|
|||
use anyhow::{anyhow, Context as _, Result};
|
||||
use anyhow::Result;
|
||||
use futures::{future::Shared, FutureExt};
|
||||
use std::{
|
||||
path::{Path, PathBuf},
|
||||
sync::Arc,
|
||||
};
|
||||
use util::{parse_env_output, ResultExt};
|
||||
use std::{path::Path, sync::Arc};
|
||||
use util::ResultExt;
|
||||
|
||||
use collections::HashMap;
|
||||
use gpui::{AppContext, Context, Model, ModelContext, Task};
|
||||
|
@ -168,10 +165,53 @@ impl From<EnvironmentOrigin> for String {
|
|||
}
|
||||
}
|
||||
|
||||
#[cfg(any(test, feature = "test-support"))]
|
||||
async fn load_shell_environment(
|
||||
_dir: &Path,
|
||||
_load_direnv: &DirenvSettings,
|
||||
) -> Result<HashMap<String, String>> {
|
||||
Ok([("ZED_FAKE_TEST_ENV".into(), "true".into())]
|
||||
.into_iter()
|
||||
.collect())
|
||||
}
|
||||
|
||||
#[cfg(not(any(test, feature = "test-support")))]
|
||||
async fn load_shell_environment(
|
||||
dir: &Path,
|
||||
load_direnv: &DirenvSettings,
|
||||
) -> Result<HashMap<String, String>> {
|
||||
use anyhow::{anyhow, Context};
|
||||
use std::path::PathBuf;
|
||||
use util::parse_env_output;
|
||||
|
||||
async fn load_direnv_environment(dir: &Path) -> Result<Option<HashMap<String, String>>> {
|
||||
let Ok(direnv_path) = which::which("direnv") else {
|
||||
return Ok(None);
|
||||
};
|
||||
|
||||
let direnv_output = smol::process::Command::new(direnv_path)
|
||||
.args(["export", "json"])
|
||||
.current_dir(dir)
|
||||
.output()
|
||||
.await
|
||||
.context("failed to spawn direnv to get local environment variables")?;
|
||||
|
||||
anyhow::ensure!(
|
||||
direnv_output.status.success(),
|
||||
"direnv exited with error {:?}",
|
||||
direnv_output.status
|
||||
);
|
||||
|
||||
let output = String::from_utf8_lossy(&direnv_output.stdout);
|
||||
if output.is_empty() {
|
||||
return Ok(None);
|
||||
}
|
||||
|
||||
Ok(Some(
|
||||
serde_json::from_str(&output).context("failed to parse direnv output")?,
|
||||
))
|
||||
}
|
||||
|
||||
let direnv_environment = match load_direnv {
|
||||
DirenvSettings::ShellHook => None,
|
||||
DirenvSettings::Direct => load_direnv_environment(dir).await?,
|
||||
|
@ -248,31 +288,3 @@ async fn load_shell_environment(
|
|||
|
||||
Ok(parsed_env)
|
||||
}
|
||||
|
||||
async fn load_direnv_environment(dir: &Path) -> Result<Option<HashMap<String, String>>> {
|
||||
let Ok(direnv_path) = which::which("direnv") else {
|
||||
return Ok(None);
|
||||
};
|
||||
|
||||
let direnv_output = smol::process::Command::new(direnv_path)
|
||||
.args(["export", "json"])
|
||||
.current_dir(dir)
|
||||
.output()
|
||||
.await
|
||||
.context("failed to spawn direnv to get local environment variables")?;
|
||||
|
||||
anyhow::ensure!(
|
||||
direnv_output.status.success(),
|
||||
"direnv exited with error {:?}",
|
||||
direnv_output.status
|
||||
);
|
||||
|
||||
let output = String::from_utf8_lossy(&direnv_output.stdout);
|
||||
if output.is_empty() {
|
||||
return Ok(None);
|
||||
}
|
||||
|
||||
Ok(Some(
|
||||
serde_json::from_str(&output).context("failed to parse direnv output")?,
|
||||
))
|
||||
}
|
||||
|
|
|
@ -4629,14 +4629,13 @@ impl LspStore {
|
|||
return;
|
||||
}
|
||||
|
||||
let local = self.as_local().unwrap();
|
||||
|
||||
let stderr_capture = Arc::new(Mutex::new(Some(String::new())));
|
||||
let lsp_adapter_delegate = ProjectLspAdapterDelegate::for_local(self, worktree_handle, cx);
|
||||
let cli_environment = self
|
||||
.as_local()
|
||||
.unwrap()
|
||||
.environment
|
||||
.read(cx)
|
||||
.get_cli_environment();
|
||||
let cli_environment = local.environment.update(cx, |environment, cx| {
|
||||
environment.get_environment(Some(worktree_id), Some(worktree_path.clone()), cx)
|
||||
});
|
||||
|
||||
let pending_server = match self.languages.create_pending_language_server(
|
||||
stderr_capture.clone(),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue