git_workty/commands/
pick.rs1use 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}