112 lines
2.5 KiB
Go
112 lines
2.5 KiB
Go
package cmd
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/spf13/cobra"
|
|
"github.com/steveyegge/gastown/internal/crew"
|
|
"github.com/steveyegge/gastown/internal/git"
|
|
"github.com/steveyegge/gastown/internal/rig"
|
|
"github.com/steveyegge/gastown/internal/style"
|
|
"github.com/steveyegge/gastown/internal/tmux"
|
|
)
|
|
|
|
// CrewListItem represents a crew worker in list output.
|
|
type CrewListItem struct {
|
|
Name string `json:"name"`
|
|
Rig string `json:"rig"`
|
|
Branch string `json:"branch"`
|
|
Path string `json:"path"`
|
|
HasSession bool `json:"has_session"`
|
|
GitClean bool `json:"git_clean"`
|
|
}
|
|
|
|
func runCrewList(cmd *cobra.Command, args []string) error {
|
|
if crewListAll && crewRig != "" {
|
|
return fmt.Errorf("cannot use --all with --rig")
|
|
}
|
|
|
|
var rigs []*rig.Rig
|
|
if crewListAll {
|
|
allRigs, _, err := getAllRigs()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
rigs = allRigs
|
|
} else {
|
|
_, r, err := getCrewManager(crewRig)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
rigs = []*rig.Rig{r}
|
|
}
|
|
|
|
// Check session and git status for each worker
|
|
t := tmux.NewTmux()
|
|
var items []CrewListItem
|
|
|
|
for _, r := range rigs {
|
|
crewGit := git.NewGit(r.Path)
|
|
crewMgr := crew.NewManager(r, crewGit)
|
|
|
|
workers, err := crewMgr.List()
|
|
if err != nil {
|
|
fmt.Fprintf(os.Stderr, "warning: failed to list crew workers in %s: %v\n", r.Name, err)
|
|
continue
|
|
}
|
|
|
|
for _, w := range workers {
|
|
sessionID := crewSessionName(r.Name, w.Name)
|
|
hasSession, _ := t.HasSession(sessionID)
|
|
|
|
workerGit := git.NewGit(w.ClonePath)
|
|
gitClean := true
|
|
if status, err := workerGit.Status(); err == nil {
|
|
gitClean = status.Clean
|
|
}
|
|
|
|
items = append(items, CrewListItem{
|
|
Name: w.Name,
|
|
Rig: r.Name,
|
|
Branch: w.Branch,
|
|
Path: w.ClonePath,
|
|
HasSession: hasSession,
|
|
GitClean: gitClean,
|
|
})
|
|
}
|
|
}
|
|
|
|
if len(items) == 0 {
|
|
fmt.Println("No crew workspaces found.")
|
|
return nil
|
|
}
|
|
|
|
if crewJSON {
|
|
enc := json.NewEncoder(os.Stdout)
|
|
enc.SetIndent("", " ")
|
|
return enc.Encode(items)
|
|
}
|
|
|
|
// Text output
|
|
fmt.Printf("%s\n\n", style.Bold.Render("Crew Workspaces"))
|
|
for _, item := range items {
|
|
status := style.Dim.Render("○")
|
|
if item.HasSession {
|
|
status = style.Bold.Render("●")
|
|
}
|
|
|
|
gitStatus := style.Dim.Render("clean")
|
|
if !item.GitClean {
|
|
gitStatus = style.Bold.Render("dirty")
|
|
}
|
|
|
|
fmt.Printf(" %s %s/%s\n", status, item.Rig, item.Name)
|
|
fmt.Printf(" Branch: %s Git: %s\n", item.Branch, gitStatus)
|
|
fmt.Printf(" %s\n", style.Dim.Render(item.Path))
|
|
}
|
|
|
|
return nil
|
|
}
|