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}