diff --git a/internal/cmd/crew_helpers.go b/internal/cmd/crew_helpers.go index 0e3eda87..f018abbf 100644 --- a/internal/cmd/crew_helpers.go +++ b/internal/cmd/crew_helpers.go @@ -8,7 +8,6 @@ import ( "strings" "syscall" - "github.com/steveyegge/gastown/internal/config" "github.com/steveyegge/gastown/internal/crew" "github.com/steveyegge/gastown/internal/git" "github.com/steveyegge/gastown/internal/rig" @@ -42,36 +41,23 @@ func inferRigFromCwd(townRoot string) (string, error) { // getCrewManager returns a crew manager for the specified or inferred rig. func getCrewManager(rigName string) (*crew.Manager, *rig.Rig, error) { - // Find town root - townRoot, err := workspace.FindFromCwdOrError() - if err != nil { - return nil, nil, fmt.Errorf("not in a Gas Town workspace: %w", err) - } - - // Load rigs config - rigsConfigPath := filepath.Join(townRoot, "mayor", "rigs.json") - rigsConfig, err := config.LoadRigsConfig(rigsConfigPath) - if err != nil { - rigsConfig = &config.RigsConfig{Rigs: make(map[string]config.RigEntry)} - } - - // Determine rig + // Handle optional rig inference from cwd if rigName == "" { + townRoot, err := workspace.FindFromCwdOrError() + if err != nil { + return nil, nil, fmt.Errorf("not in a Gas Town workspace: %w", err) + } rigName, err = inferRigFromCwd(townRoot) if err != nil { return nil, nil, fmt.Errorf("could not determine rig (use --rig flag): %w", err) } } - // Get rig - g := git.NewGit(townRoot) - rigMgr := rig.NewManager(townRoot, rigsConfig, g) - r, err := rigMgr.GetRig(rigName) + _, r, err := getRig(rigName) if err != nil { - return nil, nil, fmt.Errorf("rig '%s' not found", rigName) + return nil, nil, err } - // Create crew manager crewGit := git.NewGit(r.Path) crewMgr := crew.NewManager(r, crewGit) diff --git a/internal/cmd/polecat.go b/internal/cmd/polecat.go index bd3b57bd..a488adad 100644 --- a/internal/cmd/polecat.go +++ b/internal/cmd/polecat.go @@ -10,14 +10,12 @@ import ( "time" "github.com/spf13/cobra" - "github.com/steveyegge/gastown/internal/config" "github.com/steveyegge/gastown/internal/git" "github.com/steveyegge/gastown/internal/polecat" "github.com/steveyegge/gastown/internal/rig" "github.com/steveyegge/gastown/internal/session" "github.com/steveyegge/gastown/internal/style" "github.com/steveyegge/gastown/internal/tmux" - "github.com/steveyegge/gastown/internal/workspace" ) // Polecat command flags @@ -239,28 +237,11 @@ type PolecatListItem struct { // getPolecatManager creates a polecat manager for the given rig. func getPolecatManager(rigName string) (*polecat.Manager, *rig.Rig, error) { - // Find town root - townRoot, err := workspace.FindFromCwdOrError() + _, r, err := getRig(rigName) if err != nil { - return nil, nil, fmt.Errorf("not in a Gas Town workspace: %w", err) + return nil, nil, err } - // Load rigs config - rigsConfigPath := filepath.Join(townRoot, "mayor", "rigs.json") - rigsConfig, err := config.LoadRigsConfig(rigsConfigPath) - if err != nil { - rigsConfig = &config.RigsConfig{Rigs: make(map[string]config.RigEntry)} - } - - // Get rig - g := git.NewGit(townRoot) - rigMgr := rig.NewManager(townRoot, rigsConfig, g) - r, err := rigMgr.GetRig(rigName) - if err != nil { - return nil, nil, fmt.Errorf("rig '%s' not found", rigName) - } - - // Create polecat manager polecatGit := git.NewGit(r.Path) mgr := polecat.NewManager(r, polecatGit) diff --git a/internal/cmd/refinery.go b/internal/cmd/refinery.go index acd64a45..23d0d222 100644 --- a/internal/cmd/refinery.go +++ b/internal/cmd/refinery.go @@ -114,22 +114,9 @@ func init() { // getRefineryManager creates a refinery manager for a rig. func getRefineryManager(rigName string) (*refinery.Manager, *rig.Rig, error) { - townRoot, err := workspace.FindFromCwdOrError() + _, r, err := getRig(rigName) if err != nil { - return nil, nil, fmt.Errorf("not in a Gas Town workspace: %w", err) - } - - rigsConfigPath := filepath.Join(townRoot, "mayor", "rigs.json") - rigsConfig, err := config.LoadRigsConfig(rigsConfigPath) - if err != nil { - rigsConfig = &config.RigsConfig{Rigs: make(map[string]config.RigEntry)} - } - - g := git.NewGit(townRoot) - rigMgr := rig.NewManager(townRoot, rigsConfig, g) - r, err := rigMgr.GetRig(rigName) - if err != nil { - return nil, nil, fmt.Errorf("rig '%s' not found", rigName) + return nil, nil, err } mgr := refinery.NewManager(r) diff --git a/internal/cmd/rig_helpers.go b/internal/cmd/rig_helpers.go new file mode 100644 index 00000000..3a097aa0 --- /dev/null +++ b/internal/cmd/rig_helpers.go @@ -0,0 +1,36 @@ +package cmd + +import ( + "fmt" + "path/filepath" + + "github.com/steveyegge/gastown/internal/config" + "github.com/steveyegge/gastown/internal/git" + "github.com/steveyegge/gastown/internal/rig" + "github.com/steveyegge/gastown/internal/workspace" +) + +// getRig finds the town root and retrieves the specified rig. +// This is the common boilerplate extracted from get*Manager functions. +// Returns the town root path and rig instance. +func getRig(rigName string) (string, *rig.Rig, error) { + townRoot, err := workspace.FindFromCwdOrError() + if err != nil { + return "", nil, fmt.Errorf("not in a Gas Town workspace: %w", err) + } + + rigsConfigPath := filepath.Join(townRoot, "mayor", "rigs.json") + rigsConfig, err := config.LoadRigsConfig(rigsConfigPath) + if err != nil { + rigsConfig = &config.RigsConfig{Rigs: make(map[string]config.RigEntry)} + } + + g := git.NewGit(townRoot) + rigMgr := rig.NewManager(townRoot, rigsConfig, g) + r, err := rigMgr.GetRig(rigName) + if err != nil { + return "", nil, fmt.Errorf("rig '%s' not found", rigName) + } + + return townRoot, r, nil +} diff --git a/internal/cmd/session.go b/internal/cmd/session.go index 7dec6ca4..9c5b77b2 100644 --- a/internal/cmd/session.go +++ b/internal/cmd/session.go @@ -181,28 +181,11 @@ func parseAddress(addr string) (rigName, polecatName string, err error) { // getSessionManager creates a session manager for the given rig. func getSessionManager(rigName string) (*session.Manager, *rig.Rig, error) { - // Find town root - townRoot, err := workspace.FindFromCwdOrError() + _, r, err := getRig(rigName) if err != nil { - return nil, nil, fmt.Errorf("not in a Gas Town workspace: %w", err) + return nil, nil, err } - // Load rigs config - rigsConfigPath := filepath.Join(townRoot, "mayor", "rigs.json") - rigsConfig, err := config.LoadRigsConfig(rigsConfigPath) - if err != nil { - rigsConfig = &config.RigsConfig{Rigs: make(map[string]config.RigEntry)} - } - - // Get rig - g := git.NewGit(townRoot) - rigMgr := rig.NewManager(townRoot, rigsConfig, g) - r, err := rigMgr.GetRig(rigName) - if err != nil { - return nil, nil, fmt.Errorf("rig '%s' not found", rigName) - } - - // Create session manager t := tmux.NewTmux() mgr := session.NewManager(t, r) diff --git a/internal/cmd/witness.go b/internal/cmd/witness.go index ce542b5a..55b48d1d 100644 --- a/internal/cmd/witness.go +++ b/internal/cmd/witness.go @@ -5,17 +5,13 @@ import ( "fmt" "os" "os/exec" - "path/filepath" "time" "github.com/spf13/cobra" - "github.com/steveyegge/gastown/internal/config" - "github.com/steveyegge/gastown/internal/git" "github.com/steveyegge/gastown/internal/rig" "github.com/steveyegge/gastown/internal/style" "github.com/steveyegge/gastown/internal/tmux" "github.com/steveyegge/gastown/internal/witness" - "github.com/steveyegge/gastown/internal/workspace" ) // Witness command flags @@ -100,22 +96,9 @@ func init() { // getWitnessManager creates a witness manager for a rig. func getWitnessManager(rigName string) (*witness.Manager, *rig.Rig, error) { - townRoot, err := workspace.FindFromCwdOrError() + _, r, err := getRig(rigName) if err != nil { - return nil, nil, fmt.Errorf("not in a Gas Town workspace: %w", err) - } - - rigsConfigPath := filepath.Join(townRoot, "mayor", "rigs.json") - rigsConfig, err := config.LoadRigsConfig(rigsConfigPath) - if err != nil { - rigsConfig = &config.RigsConfig{Rigs: make(map[string]config.RigEntry)} - } - - g := git.NewGit(townRoot) - rigMgr := rig.NewManager(townRoot, rigsConfig, g) - r, err := rigMgr.GetRig(rigName) - if err != nil { - return nil, nil, fmt.Errorf("rig '%s' not found", rigName) + return nil, nil, err } mgr := witness.NewManager(r)