ralph_workflow/checkpoint/io/
git_capture.rs1use 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}