Files
2026-07-13 13:33:09 +08:00

154 lines
2.8 KiB
Go

package lib
import (
"fmt"
"plandex-cli/api"
"plandex-cli/term"
shared "plandex-shared"
)
func SelectActiveStream(args []string) (string, string, bool) {
term.StartSpinner("")
res, apiErr := api.Client.ListPlansRunning([]string{CurrentProjectId}, false)
term.StopSpinner()
if apiErr != nil {
term.OutputErrorAndExit("Error getting running plans: %v", apiErr)
return "", "", false
}
if len(res.Branches) == 0 {
fmt.Println("🤷‍♂️ No active plan stream")
fmt.Println()
term.PrintCmds("", "ps")
return "", "", false
}
var planId string
var branch string
var streamIdOrPlan string
if len(args) > 0 {
streamIdOrPlan = args[0]
}
if streamIdOrPlan != "" {
for _, b := range res.Branches {
id := res.StreamIdByBranchId[b.Id]
plan := res.PlansById[b.PlanId]
if id == streamIdOrPlan || plan.Name == streamIdOrPlan {
planId = b.PlanId
branch = b.Name
break
}
}
}
if planId == "" {
if len(res.PlansById) == 1 {
for _, p := range res.PlansById {
if p.Id == CurrentPlanId {
planId = p.Id
break
}
}
}
if planId == "" {
var opts []string
addedPlans := make(map[string]bool)
for _, plan := range res.PlansById {
if addedPlans[plan.Id] {
continue
}
opts = append(opts, plan.Name)
addedPlans[plan.Id] = true
}
selected, err := term.SelectFromList("Select an active plan", opts)
if err != nil {
term.OutputErrorAndExit("Error selecting plan: %v", err)
}
for _, p := range res.PlansById {
if p.Name == selected {
planId = p.Id
break
}
}
}
}
if planId == "" {
fmt.Println("🤷‍♂️ No active plan stream")
fmt.Println()
term.PrintCmds("", "ps")
return "", "", false
}
var planBranches []*shared.Branch
for _, b := range res.Branches {
if b.PlanId == planId {
planBranches = append(planBranches, b)
}
}
if len(planBranches) == 0 {
fmt.Println("🤷‍♂️ No active plan stream")
fmt.Println()
term.PrintCmds("", "ps")
return "", "", false
}
if len(args) > 1 {
maybeBranch := args[1]
for _, b := range planBranches {
if b.Name == maybeBranch {
branch = maybeBranch
break
}
}
}
if branch == "" {
if len(planBranches) == 1 {
name := planBranches[0].Name
if name == CurrentBranch {
branch = name
}
}
if branch == "" {
opts := make([]string, len(planBranches))
for i, b := range planBranches {
opts[i] = b.Name
}
selected, err := term.SelectFromList("Select a branch", opts)
if err != nil {
term.OutputErrorAndExit("Error selecting branch: %v", err)
}
branch = selected
}
}
if branch == "" {
fmt.Println("🤷‍♂️ No active plan stream")
fmt.Println()
term.PrintCmds("", "ps")
return "", "", false
}
return planId, branch, true
}