cascade_cli/git/
mod.rs

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
12/// Check if a directory is a Git repository
13pub fn is_git_repository(path: &Path) -> bool {
14    path.join(".git").exists() || git2::Repository::discover(path).is_ok()
15}
16
17/// Find the root of the Git repository
18pub 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
28/// Get the current working directory as a Git repository
29pub 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(&current_dir)?;
34    GitRepository::open(&repo_root)
35}