git_workty/commands/
pick.rs

1use crate::git::GitRepo;
2
3use crate::ui::{print_error, UiOptions};
4use crate::worktree::list_worktrees;
5use anyhow::Result;
6use console::Term;
7use dialoguer::FuzzySelect;
8use is_terminal::IsTerminal;
9
10pub fn execute(repo: &GitRepo, _opts: &UiOptions) -> Result<()> {
11    if !std::io::stdin().is_terminal() {
12        print_error(
13            "Cannot run interactive picker in non-TTY environment",
14            Some("Use `git workty go <name>` for non-interactive selection."),
15        );
16        std::process::exit(1);
17    }
18
19    let worktrees = list_worktrees(repo)?;
20    if worktrees.is_empty() {
21        print_error("No worktrees found", None);
22        std::process::exit(1);
23    }
24
25    let items: Vec<String> = worktrees
26        .iter()
27        .map(|worktree| worktree.name().to_string())
28        .collect();
29
30    let selection = FuzzySelect::new()
31        .with_prompt("Select worktree")
32        .items(&items)
33        .default(0)
34        .interact_on_opt(&Term::stderr())?;
35
36    match selection {
37        Some(idx) => {
38            println!("{}", worktrees[idx].path.display());
39            Ok(())
40        }
41        None => {
42            std::process::exit(130);
43        }
44    }
45}