Use login shell PATH for extension hooks
Some checks failed
Weekly OSV dependency audit / dependency-audit (push) Failing after 5s

This commit is contained in:
Georg Bauer
2026-08-30 22:40:57 +02:00
parent 6c4e792c8a
commit 32c3a1a47a
2 changed files with 19 additions and 9 deletions

View File

@@ -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()

View File

@@ -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)