1pub mod branch_manager;
2pub mod conflict_analysis;
3pub mod repository;
4
5pub use branch_manager::{BranchInfo, BranchManager};
6pub use conflict_analysis::{ConflictAnalysis, ConflictAnalyzer, ConflictRegion, ConflictType};
7pub use repository::{GitRepository, GitStatusSummary, RepositoryInfo};
8
9use crate::errors::{CascadeError, Result};
10use std::path::Path;
11
12pub fn is_git_repository(path: &Path) -> bool {
14 path.join(".git").exists() || git2::Repository::discover(path).is_ok()
15}
16
17pub fn find_repository_root(start_path: &Path) -> Result<std::path::PathBuf> {
19 let repo = git2::Repository::discover(start_path).map_err(CascadeError::Git)?;
20
21 let workdir = repo
22 .workdir()
23 .ok_or_else(|| CascadeError::config("Repository has no working directory (bare repo?)"))?;
24
25 Ok(workdir.to_path_buf())
26}
27
28pub fn get_current_repository() -> Result<GitRepository> {
30 let current_dir = std::env::current_dir()
31 .map_err(|e| CascadeError::config(format!("Could not get current directory: {e}")))?;
32
33 let repo_root = find_repository_root(¤t_dir)?;
34 GitRepository::open(&repo_root)
35}