lean_ctx/core/
git_worktree.rs1use std::path::{Path, PathBuf};
5
6pub fn main_worktree_root(root: &Path) -> Option<PathBuf> {
13 let dot_git = root.join(".git");
14 if !std::fs::symlink_metadata(&dot_git).ok()?.is_file() {
15 return None;
16 }
17 let text = std::fs::read_to_string(&dot_git).ok()?;
18 let gitdir = text.lines().next()?.strip_prefix("gitdir:")?.trim();
19 let gitdir = root.join(gitdir).canonicalize().ok()?;
20 let back = std::fs::read_to_string(gitdir.join("gitdir")).ok()?;
21 if gitdir.join(back.trim()).canonicalize().ok()? != dot_git.canonicalize().ok()? {
22 return None;
23 }
24 let common = std::fs::read_to_string(gitdir.join("commondir")).ok()?;
25 let common = gitdir.join(common.trim()).canonicalize().ok()?;
26 if common.file_name()? != ".git" {
27 return None;
28 }
29 let main = common.parent()?;
30 let main_dot_git = std::fs::symlink_metadata(main.join(".git")).ok()?;
31 (main_dot_git.is_dir() && main != root.canonicalize().ok()?).then(|| main.to_path_buf())
32}