git_x/
clean_branches.rs

1use std::process::Command;
2
3pub fn run(dry_run: bool) {
4    let output = Command::new("git")
5        .args(["branch", "--merged"])
6        .output()
7        .expect("Failed to list merged branches");
8
9    let stdout = String::from_utf8_lossy(&output.stdout);
10    let branches: Vec<String> = stdout
11        .lines()
12        .map(|line| line.trim().trim_start_matches('*').trim().to_string())
13        .filter(|branch| branch != "main" && branch != "master" && branch != "develop")
14        .collect();
15
16    let mut deleted = Vec::new();
17
18    for branch in branches {
19        if dry_run {
20            println!("(dry run) Would delete: {branch}");
21            deleted.push(branch);
22        } else {
23            let status = Command::new("git")
24                .args(["branch", "-d", &branch])
25                .status()
26                .expect("Failed to delete branch");
27
28            if status.success() {
29                deleted.push(branch);
30            }
31        }
32    }
33
34    if deleted.is_empty() {
35        println!("No merged branches to delete.");
36    } else {
37        if dry_run {
38            println!("🧪 (dry run) {} branches would be deleted:", deleted.len());
39        } else {
40            println!("🧹 Deleted {} merged branches:", deleted.len());
41        }
42        for branch in deleted {
43            println!("  {branch}");
44        }
45    }
46}