stax 0.50.2

Fast stacked Git branches and PRs
Documentation
use crate::git::GitRepo;
use anyhow::Result;
use colored::Colorize;

pub fn run() -> Result<()> {
    let repo = GitRepo::open()?;
    let before = repo.list_worktrees()?;
    let prunable_before: Vec<_> = before
        .iter()
        .filter(|worktree| worktree.is_prunable)
        .cloned()
        .collect();

    if prunable_before.is_empty() {
        println!("{}", "Nothing to prune.".dimmed());
        return Ok(());
    }

    repo.worktree_prune()?;

    let after = repo.list_worktrees()?;
    let remaining_prunable: Vec<_> = after
        .iter()
        .filter(|worktree| worktree.is_prunable)
        .map(|worktree| worktree.path.clone())
        .collect();

    let pruned = prunable_before
        .iter()
        .filter(|worktree| !remaining_prunable.contains(&worktree.path))
        .count();
    let skipped = prunable_before.len().saturating_sub(pruned);

    println!(
        "{}  {} stale {} pruned",
        "Pruned".green().bold(),
        pruned.to_string().cyan(),
        if pruned == 1 { "entry" } else { "entries" }
    );

    if skipped > 0 {
        println!(
            "  {} {} {} still marked prunable",
            "Skipped".yellow().bold(),
            skipped.to_string().yellow(),
            if skipped == 1 { "entry" } else { "entries" }
        );
    }

    Ok(())
}