Use login shell PATH for extension hooks
Some checks failed
Weekly OSV dependency audit / dependency-audit (push) Failing after 5s
Some checks failed
Weekly OSV dependency audit / dependency-audit (push) Failing after 5s
This commit is contained in:
26
src/agent.rs
26
src/agent.rs
@@ -288,6 +288,20 @@ fn shell_environment() -> Vec<(OsString, OsString)> {
|
|||||||
.unwrap_or_else(|| std::env::vars_os().collect())
|
.unwrap_or_else(|| std::env::vars_os().collect())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn environment_path(environment: &[(OsString, OsString)]) -> Option<OsString> {
|
||||||
|
environment
|
||||||
|
.iter()
|
||||||
|
.find_map(|(name, value)| (name == OsStr::new("PATH")).then(|| value.clone()))
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn shell_path() -> OsString {
|
||||||
|
USER_SHELL_ENVIRONMENT
|
||||||
|
.get()
|
||||||
|
.and_then(|environment| environment_path(environment))
|
||||||
|
.or_else(|| std::env::var_os("PATH"))
|
||||||
|
.unwrap_or_default()
|
||||||
|
}
|
||||||
|
|
||||||
fn shell_process(shell: &OsStr, command: &str) -> Command {
|
fn shell_process(shell: &OsStr, command: &str) -> Command {
|
||||||
let mut process = Command::new("/bin/sh");
|
let mut process = Command::new("/bin/sh");
|
||||||
process
|
process
|
||||||
@@ -4573,9 +4587,9 @@ mod tests {
|
|||||||
Some(directory.as_os_str()),
|
Some(directory.as_os_str()),
|
||||||
Some(directory.as_os_str()),
|
Some(directory.as_os_str()),
|
||||||
)
|
)
|
||||||
.unwrap()
|
.unwrap();
|
||||||
.into_iter()
|
let path = environment_path(&environment).unwrap();
|
||||||
.collect::<HashMap<_, _>>();
|
let environment = environment.into_iter().collect::<HashMap<_, _>>();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
environment.get(OsStr::new("DS4_LOGIN")),
|
environment.get(OsStr::new("DS4_LOGIN")),
|
||||||
Some(&OsString::from("loaded"))
|
Some(&OsString::from("loaded"))
|
||||||
@@ -4584,11 +4598,7 @@ mod tests {
|
|||||||
environment.get(OsStr::new("DS4_INTERACTIVE")),
|
environment.get(OsStr::new("DS4_INTERACTIVE")),
|
||||||
Some(&OsString::from("loaded"))
|
Some(&OsString::from("loaded"))
|
||||||
);
|
);
|
||||||
let path = environment
|
assert!(path.to_string_lossy().starts_with(&format!(
|
||||||
.get(OsStr::new("PATH"))
|
|
||||||
.unwrap()
|
|
||||||
.to_string_lossy();
|
|
||||||
assert!(path.starts_with(&format!(
|
|
||||||
"{}/interactive-bin:{}/login-bin:",
|
"{}/interactive-bin:{}/login-bin:",
|
||||||
directory.display(),
|
directory.display(),
|
||||||
directory.display()
|
directory.display()
|
||||||
|
|||||||
@@ -849,7 +849,7 @@ fn run_hook(
|
|||||||
.args(&argv[1..])
|
.args(&argv[1..])
|
||||||
.current_dir(&project_root)
|
.current_dir(&project_root)
|
||||||
.env_clear()
|
.env_clear()
|
||||||
.env("PATH", std::env::var_os("PATH").unwrap_or_default())
|
.env("PATH", crate::agent::shell_path())
|
||||||
.env("HOME", &home)
|
.env("HOME", &home)
|
||||||
.env("TMPDIR", &temporary)
|
.env("TMPDIR", &temporary)
|
||||||
.env("XDG_CONFIG_HOME", &config)
|
.env("XDG_CONFIG_HOME", &config)
|
||||||
|
|||||||
Reference in New Issue
Block a user