Skip to content

Commit bb18a6b

Browse files
committed
feat(cli): introduce concept of a selected server
1 parent 1ce8ac5 commit bb18a6b

File tree

11 files changed

+341
-50
lines changed

11 files changed

+341
-50
lines changed

branchd.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
{
22
"servers": [
33
{
4-
"ip": "3.128.177.28",
4+
"ip": "18.188.232.134",
55
"alias": "production"
66
},
77
{
8-
"ip": "18.188.232.134",
8+
"ip": "18.229.145.204",
99
"alias": "server-2"
1010
}
1111
]

go.mod

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ require (
2828
github.com/bytedance/sonic v1.13.3 // indirect
2929
github.com/bytedance/sonic/loader v0.2.4 // indirect
3030
github.com/cespare/xxhash/v2 v2.3.0 // indirect
31+
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e // indirect
3132
github.com/cloudwego/base64x v0.1.5 // indirect
3233
github.com/danieljoos/wincred v1.2.2 // indirect
3334
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
@@ -48,6 +49,7 @@ require (
4849
github.com/json-iterator/go v1.1.12 // indirect
4950
github.com/klauspost/cpuid/v2 v2.2.10 // indirect
5051
github.com/leodido/go-urn v1.4.0 // indirect
52+
github.com/manifoldco/promptui v0.9.0 // indirect
5153
github.com/mattn/go-colorable v0.1.13 // indirect
5254
github.com/mattn/go-isatty v0.0.20 // indirect
5355
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect

go.sum

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL
2525
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
2626
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
2727
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
28+
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
29+
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8=
30+
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
31+
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
2832
github.com/cloudwego/base64x v0.1.5 h1:XPciSp1xaq2VCSt6lF0phncD4koWyULpl5bUxbfCyP4=
2933
github.com/cloudwego/base64x v0.1.5/go.mod h1:0zlkT4Wn5C6NdauXdJRhSKRlJvmclQ1hhJgA0rcu/8w=
3034
github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
@@ -160,6 +164,8 @@ github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
160164
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
161165
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
162166
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
167+
github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA=
168+
github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg=
163169
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
164170
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
165171
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
@@ -306,6 +312,7 @@ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJ
306312
golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
307313
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
308314
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
315+
golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
309316
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
310317
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
311318
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=

internal/cli/commands/checkout.go

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55

66
"github.com/branchd-dev/branchd/internal/cli/client"
77
"github.com/branchd-dev/branchd/internal/cli/config"
8+
"github.com/branchd-dev/branchd/internal/cli/serverselect"
89
"github.com/spf13/cobra"
910
)
1011

@@ -33,18 +34,10 @@ func runCheckout(branchName, serverAlias string) error {
3334
return fmt.Errorf("failed to load config: %w\nRun 'branchd init' to create a configuration file", err)
3435
}
3536

36-
// Get server
37-
var server *config.Server
38-
if serverAlias != "" {
39-
server, err = cfg.GetServerByAlias(serverAlias)
40-
if err != nil {
41-
return err
42-
}
43-
} else {
44-
server, err = cfg.GetDefaultServer()
45-
if err != nil {
46-
return err
47-
}
37+
// Resolve which server to use
38+
server, err := serverselect.ResolveServer(cfg, serverAlias)
39+
if err != nil {
40+
return err
4841
}
4942

5043
if server.IP == "" {

internal/cli/commands/dash.go

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"runtime"
77

88
"github.com/branchd-dev/branchd/internal/cli/config"
9+
"github.com/branchd-dev/branchd/internal/cli/serverselect"
910
"github.com/spf13/cobra"
1011
)
1112

@@ -33,18 +34,10 @@ func runDash(serverAlias string) error {
3334
return fmt.Errorf("failed to load config: %w\nRun 'branchd init' to create a configuration file", err)
3435
}
3536

36-
// Get server
37-
var server *config.Server
38-
if serverAlias != "" {
39-
server, err = cfg.GetServerByAlias(serverAlias)
40-
if err != nil {
41-
return err
42-
}
43-
} else {
44-
server, err = cfg.GetDefaultServer()
45-
if err != nil {
46-
return err
47-
}
37+
// Resolve which server to use
38+
server, err := serverselect.ResolveServer(cfg, serverAlias)
39+
if err != nil {
40+
return err
4841
}
4942

5043
if server.IP == "" {

internal/cli/commands/delete.go

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55

66
"github.com/branchd-dev/branchd/internal/cli/client"
77
"github.com/branchd-dev/branchd/internal/cli/config"
8+
"github.com/branchd-dev/branchd/internal/cli/serverselect"
89
"github.com/spf13/cobra"
910
)
1011

@@ -33,18 +34,10 @@ func runDelete(branchName, serverAlias string) error {
3334
return fmt.Errorf("failed to load config: %w\nRun 'branchd init' to create a configuration file", err)
3435
}
3536

36-
// Get server
37-
var server *config.Server
38-
if serverAlias != "" {
39-
server, err = cfg.GetServerByAlias(serverAlias)
40-
if err != nil {
41-
return err
42-
}
43-
} else {
44-
server, err = cfg.GetDefaultServer()
45-
if err != nil {
46-
return err
47-
}
37+
// Resolve which server to use
38+
server, err := serverselect.ResolveServer(cfg, serverAlias)
39+
if err != nil {
40+
return err
4841
}
4942

5043
if server.IP == "" {

internal/cli/commands/list.go

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77

88
"github.com/branchd-dev/branchd/internal/cli/client"
99
"github.com/branchd-dev/branchd/internal/cli/config"
10+
"github.com/branchd-dev/branchd/internal/cli/serverselect"
1011
"github.com/spf13/cobra"
1112
)
1213

@@ -35,18 +36,10 @@ func runList(serverAlias string) error {
3536
return fmt.Errorf("failed to load config: %w\nRun 'branchd init' to create a configuration file", err)
3637
}
3738

38-
// Get server
39-
var server *config.Server
40-
if serverAlias != "" {
41-
server, err = cfg.GetServerByAlias(serverAlias)
42-
if err != nil {
43-
return err
44-
}
45-
} else {
46-
server, err = cfg.GetDefaultServer()
47-
if err != nil {
48-
return err
49-
}
39+
// Resolve which server to use
40+
server, err := serverselect.ResolveServer(cfg, serverAlias)
41+
if err != nil {
42+
return err
5043
}
5144

5245
if server.IP == "" {
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package commands
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/branchd-dev/branchd/internal/cli/config"
7+
"github.com/branchd-dev/branchd/internal/cli/serverselect"
8+
"github.com/branchd-dev/branchd/internal/cli/userconfig"
9+
"github.com/spf13/cobra"
10+
)
11+
12+
// NewSelectServerCmd creates the select-server command
13+
func NewSelectServerCmd() *cobra.Command {
14+
cmd := &cobra.Command{
15+
Use: "select-server [ip-or-alias]",
16+
Short: "Select the default server to use for commands",
17+
Long: `Select the default server to use for commands.
18+
19+
If no IP or alias is provided, an interactive prompt will be shown.
20+
Otherwise, you can directly specify a server by its IP address or alias.
21+
22+
Examples:
23+
branchd select-server # Interactive selection
24+
branchd select-server 192.168.1.1 # Select by IP
25+
branchd select-server production # Select by alias`,
26+
Args: cobra.MaximumNArgs(1),
27+
RunE: func(cmd *cobra.Command, args []string) error {
28+
var ipOrAlias string
29+
if len(args) > 0 {
30+
ipOrAlias = args[0]
31+
}
32+
return runSelectServer(ipOrAlias)
33+
},
34+
}
35+
36+
return cmd
37+
}
38+
39+
func runSelectServer(ipOrAlias string) error {
40+
// Load project config
41+
cfg, err := config.LoadFromCurrentDir()
42+
if err != nil {
43+
return fmt.Errorf("failed to load config: %w\nRun 'branchd init' to create a configuration file", err)
44+
}
45+
46+
var server *config.Server
47+
48+
if ipOrAlias != "" {
49+
// User provided an IP or alias, find it
50+
server, err = serverselect.GetServerByIPOrAlias(cfg, ipOrAlias)
51+
if err != nil {
52+
return err
53+
}
54+
} else {
55+
// Show interactive selection
56+
server, err = serverselect.PromptServerSelection(cfg)
57+
if err != nil {
58+
return err
59+
}
60+
}
61+
62+
// Save the selected server
63+
if err := userconfig.SetSelectedServer(server.IP); err != nil {
64+
return fmt.Errorf("failed to save selected server: %w", err)
65+
}
66+
67+
fmt.Printf("Selected server: %s (%s)\n", server.Alias, server.IP)
68+
return nil
69+
}

internal/cli/root.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ func init() {
4848
rootCmd.AddCommand(commands.NewDeleteCmd())
4949
rootCmd.AddCommand(commands.NewListCmd())
5050
rootCmd.AddCommand(commands.NewDashCmd())
51+
rootCmd.AddCommand(commands.NewSelectServerCmd())
5152
rootCmd.AddCommand(commands.NewUpdateCmd(version))
5253
rootCmd.AddCommand(commands.NewUpdateServerCmd())
5354
}

0 commit comments

Comments
 (0)