From 716067ba05d18ffe8fc0454a14ab75bf6e35086c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20K=C4=99pka?= Date: Sat, 12 Jun 2021 08:30:55 +0200 Subject: [PATCH] Add more ways to detect runtime directory --- helix-core/src/lib.rs | 32 +++++++++++++++++++++++--------- helix-core/src/syntax.rs | 6 ++++-- 2 files changed, 27 insertions(+), 11 deletions(-) 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 { diff --git a/helix-core/src/syntax.rs b/helix-core/src/syntax.rs index 5c4c95b9..ae058eb1 100644 --- a/helix-core/src/syntax.rs +++ b/helix-core/src/syntax.rs @@ -76,8 +76,10 @@ pub struct IndentQuery { #[cfg(not(feature = "embed_runtime"))] fn load_runtime_file(language: &str, filename: &str) -> Result { - let root = crate::runtime_dir(); - let path = root.join("queries").join(language).join(filename); + let path = crate::RUNTIME_DIR + .join("queries") + .join(language) + .join(filename); std::fs::read_to_string(&path) }