diff options
author | Blaž Hrastnik | 2021-06-07 12:32:01 +0000 |
---|---|---|
committer | Blaž Hrastnik | 2021-06-07 12:32:01 +0000 |
commit | 8d6fad4cac65083a0b08e49391c579ec793bc8f3 (patch) | |
tree | 80c2f9dd475e6d141d7828a1b7224cd316a7bc82 /helix-core | |
parent | 14830e75ff9316f8a5a428a06f3b3c8c4706d35a (diff) |
lsp: Provide workspace root on client.initialize()
Diffstat (limited to 'helix-core')
-rw-r--r-- | helix-core/src/lib.rs | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/helix-core/src/lib.rs b/helix-core/src/lib.rs index 4be3e71b..cfe466ed 100644 --- a/helix-core/src/lib.rs +++ b/helix-core/src/lib.rs @@ -45,6 +45,30 @@ pub(crate) fn find_first_non_whitespace_char(text: RopeSlice, line_num: usize) - None } +pub fn find_root(root: Option<&str>) -> Option<std::path::PathBuf> { + let current_dir = std::env::current_dir().expect("unable to determine current directory"); + + let root = match root { + Some(root) => { + let root = std::path::Path::new(root); + if root.is_absolute() { + root.to_path_buf() + } else { + current_dir.join(root) + } + } + None => current_dir, + }; + + for ancestor in root.ancestors() { + // TODO: also use defined roots if git isn't found + if ancestor.join(".git").is_dir() { + return Some(ancestor.to_path_buf()); + } + } + None +} + #[cfg(not(embed_runtime))] pub fn runtime_dir() -> std::path::PathBuf { // runtime env var || dir where binary is located |