Skip to main content

ralph_workflow/checkpoint/io/
git_capture.rs

1use crate::executor::ProcessExecutor;
2
3pub fn git_head_oid(executor: &dyn ProcessExecutor) -> Option<String> {
4    executor
5        .execute("git", &["rev-parse", "HEAD"], &[], None)
6        .ok()
7        .filter(|output| output.status.success())
8        .map(|output| output.stdout.trim().to_string())
9}
10
11pub fn git_branch_name(executor: &dyn ProcessExecutor) -> Option<String> {
12    executor
13        .execute("git", &["rev-parse", "--abbrev-ref", "HEAD"], &[], None)
14        .ok()
15        .filter(|output| output.status.success())
16        .map(|output| output.stdout.trim().to_string())
17        .filter(|branch| !branch.is_empty() && branch != "HEAD")
18}
19
20pub fn git_status(executor: &dyn ProcessExecutor) -> Option<String> {
21    executor
22        .execute("git", &["status", "--porcelain"], &[], None)
23        .ok()
24        .filter(|output| output.status.success())
25        .map(|output| output.stdout.trim().to_string())
26        .filter(|status| !status.is_empty())
27}
28
29pub fn git_modified_files(executor: &dyn ProcessExecutor) -> Option<Vec<String>> {
30    let diff_output = executor
31        .execute("git", &["diff", "--name-only"], &[], None)
32        .ok()
33        .filter(|output| output.status.success())
34        .map(|output| output.stdout)?;
35
36    let modified_files: Vec<String> = diff_output
37        .lines()
38        .map(|line| line.trim().to_string())
39        .filter(|line| !line.is_empty())
40        .collect();
41
42    if modified_files.is_empty() {
43        None
44    } else {
45        Some(modified_files)
46    }
47}