#![allow(dead_code)]
use std::path::{Path, PathBuf};
pub fn find_omne_root(start: &Path) -> Option<PathBuf> {
let mut current = start.canonicalize().ok()?;
loop {
if current.join(".omne").is_dir() {
return Some(current);
}
if !current.pop() {
return None;
}
}
}
#[cfg(test)]
mod tests {
use std::fs;
use tempfile::TempDir;
use super::*;
#[test]
fn finds_root_when_omne_exists_at_start() {
let tmp = TempDir::new().expect("create tempdir");
fs::create_dir(tmp.path().join(".omne")).expect("create .omne");
let found = find_omne_root(tmp.path());
let expected = tmp.path().canonicalize().expect("canonicalize tmpdir");
assert_eq!(found, Some(expected));
}
#[test]
fn finds_root_from_subdirectory() {
let tmp = TempDir::new().expect("create tempdir");
fs::create_dir(tmp.path().join(".omne")).expect("create .omne");
let deep = tmp.path().join("src").join("deep");
fs::create_dir_all(&deep).expect("create deep subdir");
let found = find_omne_root(&deep);
let expected = tmp.path().canonicalize().expect("canonicalize tmpdir");
assert_eq!(found, Some(expected));
}
#[test]
fn walk_up_matches_actual_ancestor_chain() {
let tmp = TempDir::new().expect("create tempdir");
let canonical_start = tmp.path().canonicalize().expect("canonicalize tmpdir");
let expected = canonical_start
.ancestors()
.find(|ancestor| ancestor.join(".omne").is_dir())
.map(Path::to_path_buf);
let found = find_omne_root(tmp.path());
assert_eq!(found, expected);
}
#[test]
fn returns_none_when_start_does_not_exist() {
let tmp = TempDir::new().expect("create tempdir");
let missing = tmp.path().join("does-not-exist");
let found = find_omne_root(&missing);
assert_eq!(found, None);
}
}