From 8444f52e9a53ba770f77b45e4b71b84ba452b627 Mon Sep 17 00:00:00 2001 From: Pascal Kuthe Date: Mon, 20 May 2024 14:44:53 +0200 Subject: [PATCH] correctly handle opening helix inside symlinked directory (#10728) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * correctly handle opening helix inside symlinked directory * Update helix-stdx/src/env.rs --------- Co-authored-by: Blaž Hrastnik --- helix-stdx/src/env.rs | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/helix-stdx/src/env.rs b/helix-stdx/src/env.rs index 59aba0adc2ce..51450d225870 100644 --- a/helix-stdx/src/env.rs +++ b/helix-stdx/src/env.rs @@ -14,13 +14,23 @@ pub fn current_working_dir() -> PathBuf { return path.clone(); } - let path = std::env::current_dir() - .map(crate::path::normalize) - .expect("Couldn't determine current working directory"); - let mut cwd = CWD.write().unwrap(); - *cwd = Some(path.clone()); + // implementation of crossplatform pwd -L + // we want pwd -L so that symlinked directories are handled correctly + let mut cwd = std::env::current_dir().expect("Couldn't determine current working directory"); + + let pwd = std::env::var_os("PWD"); + #[cfg(windows)] + let pwd = pwd.or_else(|| std::env::var_os("CD")); + + if let Some(pwd) = pwd.map(PathBuf::from) { + if pwd.canonicalize().ok().as_ref() == Some(&cwd) { + cwd = pwd; + } + } + let mut dst = CWD.write().unwrap(); + *dst = Some(cwd.clone()); - path + cwd } pub fn set_current_working_dir(path: impl AsRef) -> std::io::Result<()> {