diff options
| author | 魏曹先生 <1992414357@qq.com> | 2025-09-25 13:22:50 +0800 |
|---|---|---|
| committer | 魏曹先生 <1992414357@qq.com> | 2025-09-25 13:22:50 +0800 |
| commit | 07b1ce2c3398c69b021ea2418a057eb7b6cacc40 (patch) | |
| tree | 73d6c8f35df425b15c905819fb0d37aec02e6563 /crates/vcs/src/current.rs | |
| parent | 28828776b7aaa6f2bf723837eab1cae859582be5 (diff) | |
Rename `env` to `vcs`
Diffstat (limited to 'crates/vcs/src/current.rs')
| -rw-r--r-- | crates/vcs/src/current.rs | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/crates/vcs/src/current.rs b/crates/vcs/src/current.rs new file mode 100644 index 0000000..97b5058 --- /dev/null +++ b/crates/vcs/src/current.rs @@ -0,0 +1,78 @@ +use crate::constants::*; +use std::io::{self, Error}; +use std::{env::set_current_dir, path::PathBuf}; + +/// Find the nearest vault or local workspace and correct the `current_dir` to it +pub fn correct_current_dir() -> Result<(), io::Error> { + if let Some(local_workspace) = current_local_path() { + set_current_dir(local_workspace)?; + return Ok(()); + } + if let Some(vault) = current_vault_path() { + set_current_dir(vault)?; + return Ok(()); + } + Err(Error::new( + io::ErrorKind::NotFound, + "Could not find any vault or local workspace!", + )) +} + +/// Get the nearest Vault directory from `current_dir` +pub fn current_vault_path() -> Option<PathBuf> { + let current_dir = std::env::current_dir().ok()?; + find_vault_path(current_dir) +} + +/// Get the nearest local workspace from `current_dir` +pub fn current_local_path() -> Option<PathBuf> { + let current_dir = std::env::current_dir().ok()?; + find_local_path(current_dir) +} + +/// Get the nearest Vault directory from the specified path +pub fn find_vault_path(path: impl Into<PathBuf>) -> Option<PathBuf> { + let mut current_path = path.into(); + let vault_file = SERVER_FILE_VAULT; + + loop { + let vault_toml_path = current_path.join(vault_file); + if vault_toml_path.exists() { + return Some(current_path); + } + + if let Some(parent) = current_path.parent() { + current_path = parent.to_path_buf(); + } else { + break; + } + } + + None +} + +/// Get the nearest local workspace from the specified path +pub fn find_local_path(path: impl Into<PathBuf>) -> Option<PathBuf> { + let mut current_path = path.into(); + let workspace_dir = CLIENT_PATH_WORKSPACE_ROOT; + + loop { + let jvc_path = current_path.join(workspace_dir); + if jvc_path.exists() { + return Some(current_path); + } + + if let Some(parent) = current_path.parent() { + current_path = parent.to_path_buf(); + } else { + break; + } + } + + None +} + +/// Get the system's document directory and join with .just_enough_vcs +pub fn current_doc_dir() -> Option<PathBuf> { + dirs::document_dir().map(|path| path.join(".just_enough_vcs")) +} |
