Vapora/crates/vapora-worktree/src/detect.rs

63 lines
1.7 KiB
Rust
Raw Normal View History

use std::path::Path;
/// Which VCS is active in a directory, detected by filesystem inspection.
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum VcsDetection {
/// Both `.jj/` and `.git/` present — jj colocated mode (preferred for
/// Radicle interop).
JjColocated,
/// Only `.jj/` present.
Jj,
/// Only `.git/` present.
Git,
/// Neither found.
None,
}
/// Detect VCS by inspecting `path` for `.jj/` and `.git/` directories.
pub fn detect_vcs(path: &Path) -> VcsDetection {
let has_jj = path.join(".jj").is_dir();
let has_git = path.join(".git").is_dir();
match (has_jj, has_git) {
(true, true) => VcsDetection::JjColocated,
(true, false) => VcsDetection::Jj,
(false, true) => VcsDetection::Git,
(false, false) => VcsDetection::None,
}
}
#[cfg(test)]
mod tests {
use tempfile::TempDir;
use super::*;
#[test]
fn detect_none() {
let dir = TempDir::new().unwrap();
assert_eq!(detect_vcs(dir.path()), VcsDetection::None);
}
#[test]
fn detect_git_only() {
let dir = TempDir::new().unwrap();
std::fs::create_dir(dir.path().join(".git")).unwrap();
assert_eq!(detect_vcs(dir.path()), VcsDetection::Git);
}
#[test]
fn detect_jj_only() {
let dir = TempDir::new().unwrap();
std::fs::create_dir(dir.path().join(".jj")).unwrap();
assert_eq!(detect_vcs(dir.path()), VcsDetection::Jj);
}
#[test]
fn detect_colocated() {
let dir = TempDir::new().unwrap();
std::fs::create_dir(dir.path().join(".jj")).unwrap();
std::fs::create_dir(dir.path().join(".git")).unwrap();
assert_eq!(detect_vcs(dir.path()), VcsDetection::JjColocated);
}
}