From 716067ba05d18ffe8fc0454a14ab75bf6e35086c Mon Sep 17 00:00:00 2001 From: Wojciech Kępka Date: Sat, 12 Jun 2021 08:30:55 +0200 Subject: Add more ways to detect runtime directory --- helix-core/src/lib.rs | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) (limited to 'helix-core/src/lib.rs') diff --git a/helix-core/src/lib.rs b/helix-core/src/lib.rs index a9792562..3394859b 100644 --- a/helix-core/src/lib.rs +++ b/helix-core/src/lib.rs @@ -17,6 +17,9 @@ mod state; pub mod syntax; mod transaction; +static RUNTIME_DIR: once_cell::sync::Lazy = + once_cell::sync::Lazy::new(runtime_dir); + pub fn find_first_non_whitespace_char(line: RopeSlice) -> Option { line.chars().position(|ch| !ch.is_whitespace()) } @@ -47,15 +50,26 @@ pub fn find_root(root: Option<&str>) -> Option { #[cfg(not(embed_runtime))] pub fn runtime_dir() -> std::path::PathBuf { - // runtime env var || dir where binary is located - std::env::var("HELIX_RUNTIME") - .map(|path| path.into()) - .unwrap_or_else(|_| { - std::env::current_exe() - .ok() - .and_then(|path| path.parent().map(|path| path.to_path_buf())) - .unwrap() - }) + if let Ok(dir) = std::env::var("HELIX_RUNTIME") { + return dir.into(); + } + + const RT_DIR: &str = "runtime"; + let conf_dir = config_dir().join(RT_DIR); + if conf_dir.exists() { + return conf_dir; + } + + if let Ok(dir) = std::env::var("CARGO_MANIFEST_DIR") { + // this is the directory of the crate being run by cargo, we need the workspace path so we take the parent + return std::path::PathBuf::from(dir).parent().unwrap().join(RT_DIR); + } + + // fallback to location of the executable being run + std::env::current_exe() + .ok() + .and_then(|path| path.parent().map(|path| path.to_path_buf())) + .unwrap() } pub fn config_dir() -> std::path::PathBuf { -- cgit v1.2.3-70-g09d2