Skip to main content

agm/cmd/
git_stat.rs

1use agm_core::git_stat::GitStat;
2
3pub fn run(cwd: &str) -> GitStat {
4    let Ok(repo) = git2::Repository::discover(cwd) else {
5        return GitStat::default();
6    };
7
8    let (insertions, deletions) = repo
9        .diff_index_to_workdir(None, None)
10        .and_then(|d| d.stats())
11        .map_or((0, 0), |s| (s.insertions(), s.deletions()));
12
13    let new_files = repo
14        .statuses(Some(
15            git2::StatusOptions::new()
16                .include_untracked(true)
17                .recurse_untracked_dirs(true)
18                .exclude_submodules(true)
19                .include_ignored(false),
20        ))
21        .map_or(0, |st| {
22            st.iter().filter(|s| s.status().contains(git2::Status::WT_NEW)).count()
23        });
24
25    let is_worktree = repo.is_worktree();
26
27    GitStat {
28        insertions,
29        deletions,
30        new_files,
31        is_worktree,
32    }
33}