From 32c3a1a47a9aef10992aa3954f2d96db4ac3456f Mon Sep 17 00:00:00 2001 From: Georg Bauer Date: Sun, 30 Aug 2026 22:40:57 +0200 Subject: [PATCH] Use login shell PATH for extension hooks --- src/agent.rs | 26 ++++++++++++++++++-------- src/extensions.rs | 2 +- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/src/agent.rs b/src/agent.rs index 8e64ee5..9629892 100644 --- a/src/agent.rs +++ b/src/agent.rs @@ -288,6 +288,20 @@ fn shell_environment() -> Vec<(OsString, OsString)> { .unwrap_or_else(|| std::env::vars_os().collect()) } +fn environment_path(environment: &[(OsString, OsString)]) -> Option { + 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 { let mut process = Command::new("/bin/sh"); process @@ -4573,9 +4587,9 @@ mod tests { Some(directory.as_os_str()), Some(directory.as_os_str()), ) - .unwrap() - .into_iter() - .collect::>(); + .unwrap(); + let path = environment_path(&environment).unwrap(); + let environment = environment.into_iter().collect::>(); assert_eq!( environment.get(OsStr::new("DS4_LOGIN")), Some(&OsString::from("loaded")) @@ -4584,11 +4598,7 @@ mod tests { environment.get(OsStr::new("DS4_INTERACTIVE")), Some(&OsString::from("loaded")) ); - let path = environment - .get(OsStr::new("PATH")) - .unwrap() - .to_string_lossy(); - assert!(path.starts_with(&format!( + assert!(path.to_string_lossy().starts_with(&format!( "{}/interactive-bin:{}/login-bin:", directory.display(), directory.display() diff --git a/src/extensions.rs b/src/extensions.rs index 35314e7..4507d33 100644 --- a/src/extensions.rs +++ b/src/extensions.rs @@ -849,7 +849,7 @@ fn run_hook( .args(&argv[1..]) .current_dir(&project_root) .env_clear() - .env("PATH", std::env::var_os("PATH").unwrap_or_default()) + .env("PATH", crate::agent::shell_path()) .env("HOME", &home) .env("TMPDIR", &temporary) .env("XDG_CONFIG_HOME", &config)