Skip to content

Commit 4a01477

Browse files
authored
feat: Pin workspace to current directory via local flag (#53)
* chore: Remove TODO comment * feat: Alias team_id to workspace_id with backward compat * feat: Set local workspace flag * chore: Change CLI version * feat: Change workspace selection notice depending on global or local scope * docs: workspace description * feat: Change local config file location
1 parent bc9568f commit 4a01477

File tree

8 files changed

+54
-39
lines changed

8 files changed

+54
-39
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ coverage.txt
77
/hookdeck-linux
88
/hookdeck-windows.exe
99
/hookdeck-cli
10-
/hookdeck.toml
10+
/.hookdeck
1111
default_cassette.yaml
1212
.vscode/
1313
__debug_bin

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ Inventory Service forwarding to /webhooks/shopify/inventory
221221

222222
### Manage active workspace
223223

224-
If you are a part of many workspaces, you can switch between them using our workspace management commands.
224+
If you are a part of multiple workspaces, you can switch between them using our workspace management commands.
225225

226226
```sh-session
227227
$ hookdeck workspace list

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "hookdeck-cli",
3-
"version": "0.7.0",
3+
"version": "0.8.0",
44
"description": "Hookdeck CLI",
55
"repository": {
66
"type": "git",

pkg/cmd/workspace_use.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ import (
99
)
1010

1111
type workspaceUseCmd struct {
12-
cmd *cobra.Command
12+
cmd *cobra.Command
13+
local bool
1314
}
1415

1516
func newWorkspaceUseCmd() *workspaceUseCmd {
@@ -21,21 +22,26 @@ func newWorkspaceUseCmd() *workspaceUseCmd {
2122
Short: "Select your active workspace for future commands",
2223
RunE: lc.runWorkspaceUseCmd,
2324
}
25+
lc.cmd.Flags().BoolVar(&lc.local, "local", false, "Pin active workspace to the current directory")
2426

2527
return lc
2628
}
2729

28-
// TODO: handle case where workspace name is not unique
2930
func (lc *workspaceUseCmd) runWorkspaceUseCmd(cmd *cobra.Command, args []string) error {
3031
workspaces, err := workspace.ListWorkspaces(&Config)
3132
if err != nil {
3233
return err
3334
}
3435

36+
selectedTemplate := "Selecting workspace {{ .Name | green }}"
37+
if lc.local {
38+
selectedTemplate = "Pinning workspace {{ .Name | green }} to current directory"
39+
}
40+
3541
templates := &promptui.SelectTemplates{
3642
Active: "▸ {{ .Name | green }}",
3743
Inactive: " {{ .Name }}",
38-
Selected: "Selecting workspace {{ .Name | green }}",
44+
Selected: selectedTemplate,
3945
}
4046

4147
prompt := promptui.Select{
@@ -50,5 +56,5 @@ func (lc *workspaceUseCmd) runWorkspaceUseCmd(cmd *cobra.Command, args []string)
5056
}
5157

5258
workspace := workspaces[i]
53-
return Config.UseWorkspace(workspace.Id, workspace.Mode)
59+
return Config.UseWorkspace(lc.local, workspace.Id, workspace.Mode)
5460
}

pkg/config/config.go

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ func (c *Config) InitConfig() {
112112
}
113113
LocalConfigFile := ""
114114
if c.LocalConfigFile == "" {
115-
LocalConfigFile = filepath.Join(workspaceFolder, "hookdeck.toml")
115+
LocalConfigFile = filepath.Join(workspaceFolder, ".hookdeck/config.toml")
116116
} else {
117117
if filepath.IsAbs(c.LocalConfigFile) {
118118
LocalConfigFile = c.LocalConfigFile
@@ -203,10 +203,10 @@ func (c *Config) EditConfig() error {
203203
}
204204

205205
// UseWorkspace selects the active workspace to be used
206-
func (c *Config) UseWorkspace(teamId string, teamMode string) error {
206+
func (c *Config) UseWorkspace(local bool, teamId string, teamMode string) error {
207207
c.Profile.TeamID = teamId
208208
c.Profile.TeamMode = teamMode
209-
return c.Profile.SaveProfile()
209+
return c.Profile.SaveProfile(local)
210210
}
211211

212212
func (c *Config) ListProfiles() []string {
@@ -248,29 +248,26 @@ func (c *Config) RemoveAllProfiles() error {
248248

249249
// Construct the config struct from flags > local config > global config
250250
func (c *Config) constructConfig() {
251-
c.Color = getStringConfig(c.Color , c.LocalConfig.GetString("color") , c.GlobalConfig.GetString(("color")) , "auto")
252-
c.LogLevel = getStringConfig(c.LogLevel , c.LocalConfig.GetString("log") , c.GlobalConfig.GetString(("log")) , "info")
253-
c.APIBaseURL = getStringConfig(c.APIBaseURL , c.LocalConfig.GetString("api_base") , c.GlobalConfig.GetString(("api_base")) , hookdeck.DefaultAPIBaseURL)
254-
c.DashboardBaseURL = getStringConfig(c.DashboardBaseURL , c.LocalConfig.GetString("dashboard_base") , c.GlobalConfig.GetString(("dashboard_base")) , hookdeck.DefaultDashboardBaseURL)
255-
c.ConsoleBaseURL = getStringConfig(c.ConsoleBaseURL , c.LocalConfig.GetString("console_base") , c.GlobalConfig.GetString(("console_base")) , hookdeck.DefaultConsoleBaseURL)
256-
c.WSBaseURL = getStringConfig(c.WSBaseURL , c.LocalConfig.GetString("ws_base") , c.GlobalConfig.GetString(("ws_base")) , hookdeck.DefaultWebsocektURL)
257-
c.Profile.Name = getStringConfig(c.Profile.Name , c.LocalConfig.GetString("profile") , c.GlobalConfig.GetString(("profile")) , hookdeck.DefaultProfileName)
258-
c.Profile.APIKey = getStringConfig(c.Profile.APIKey , c.LocalConfig.GetString("api_key") , c.GlobalConfig.GetString((c.Profile.GetConfigField("api_key"))) , "")
259-
c.Profile.TeamID = getStringConfig(c.Profile.TeamID , c.LocalConfig.GetString("team_id") , c.GlobalConfig.GetString((c.Profile.GetConfigField("team_id"))) , "")
260-
c.Profile.TeamMode = getStringConfig(c.Profile.TeamMode , c.LocalConfig.GetString("team_mode") , c.GlobalConfig.GetString((c.Profile.GetConfigField("team_mode"))), "")
251+
c.Color = getStringConfig([]string{c.Color , c.LocalConfig.GetString("color") , c.GlobalConfig.GetString(("color")) , "auto"})
252+
c.LogLevel = getStringConfig([]string{c.LogLevel , c.LocalConfig.GetString("log") , c.GlobalConfig.GetString(("log")) , "info"})
253+
c.APIBaseURL = getStringConfig([]string{c.APIBaseURL , c.LocalConfig.GetString("api_base") , c.GlobalConfig.GetString(("api_base")) , hookdeck.DefaultAPIBaseURL})
254+
c.DashboardBaseURL = getStringConfig([]string{c.DashboardBaseURL , c.LocalConfig.GetString("dashboard_base") , c.GlobalConfig.GetString(("dashboard_base")) , hookdeck.DefaultDashboardBaseURL})
255+
c.ConsoleBaseURL = getStringConfig([]string{c.ConsoleBaseURL , c.LocalConfig.GetString("console_base") , c.GlobalConfig.GetString(("console_base")) , hookdeck.DefaultConsoleBaseURL})
256+
c.WSBaseURL = getStringConfig([]string{c.WSBaseURL , c.LocalConfig.GetString("ws_base") , c.GlobalConfig.GetString(("ws_base")) , hookdeck.DefaultWebsocektURL})
257+
c.Profile.Name = getStringConfig([]string{c.Profile.Name , c.LocalConfig.GetString("profile") , c.GlobalConfig.GetString(("profile")) , hookdeck.DefaultProfileName})
258+
c.Profile.APIKey = getStringConfig([]string{c.Profile.APIKey , c.LocalConfig.GetString("api_key") , c.GlobalConfig.GetString((c.Profile.GetConfigField("api_key"))) , ""})
259+
c.Profile.TeamID = getStringConfig([]string{c.Profile.TeamID , c.LocalConfig.GetString("workspace_id") , c.LocalConfig.GetString("team_id") , c.GlobalConfig.GetString((c.Profile.GetConfigField("workspace_id"))) , c.GlobalConfig.GetString((c.Profile.GetConfigField("team_id"))) , ""})
260+
c.Profile.TeamMode = getStringConfig([]string{c.Profile.TeamMode , c.LocalConfig.GetString("workspace_mode") , c.LocalConfig.GetString("team_mode") , c.GlobalConfig.GetString((c.Profile.GetConfigField("workspace_mode"))) , c.GlobalConfig.GetString((c.Profile.GetConfigField("team_mode"))) , ""})
261261
}
262262

263-
func getStringConfig(v1 string, v2 string, v3 string, v4 string) string {
264-
if v1 != "" {
265-
return v1
266-
}
267-
if v2 != "" {
268-
return v2
269-
}
270-
if v3 != "" {
271-
return v3
263+
func getStringConfig(values []string) string {
264+
for _, str := range values {
265+
if str != "" {
266+
return str
267+
}
272268
}
273-
return v4
269+
270+
return values[len(values)-1]
274271
}
275272

276273
// isProfile identifies whether a value in the config pertains to a profile.

pkg/config/profile.go

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,23 @@ func (p *Profile) GetConfigField(field string) string {
1414
return p.Name + "." + field
1515
}
1616

17-
func (p *Profile) SaveProfile() error {
18-
p.Config.GlobalConfig.Set(p.GetConfigField("api_key"), p.APIKey)
19-
p.Config.GlobalConfig.Set(p.GetConfigField("team_id"), p.TeamID)
20-
p.Config.GlobalConfig.Set(p.GetConfigField("team_mode"), p.TeamMode)
21-
return p.Config.GlobalConfig.WriteConfig()
17+
func (p *Profile) SaveProfile(local bool) error {
18+
// in local, we're d setting mode because it should always be inbound
19+
// as a user can't have both inbound & console teams (i think)
20+
// and we don't need to expose it to the end user
21+
if (local) {
22+
p.Config.GlobalConfig.Set(p.GetConfigField("api_key"), p.APIKey)
23+
if err := p.Config.GlobalConfig.WriteConfig(); err != nil {
24+
return err
25+
}
26+
p.Config.LocalConfig.Set("workspace_id", p.TeamID)
27+
return p.Config.LocalConfig.WriteConfig()
28+
} else {
29+
p.Config.GlobalConfig.Set(p.GetConfigField("api_key"), p.APIKey)
30+
p.Config.GlobalConfig.Set(p.GetConfigField("workspace_id"), p.TeamID)
31+
p.Config.GlobalConfig.Set(p.GetConfigField("workspace_mode"), p.TeamMode)
32+
return p.Config.GlobalConfig.WriteConfig()
33+
}
2234
}
2335

2436
func (p *Profile) RemoveProfile() error {

pkg/login/client_login.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ func Login(config *config.Config, input io.Reader) error {
8686
config.Profile.TeamID = response.TeamID
8787
config.Profile.TeamMode = response.TeamMode
8888

89-
if err = config.Profile.SaveProfile(); err != nil {
89+
if err = config.Profile.SaveProfile(false); err != nil {
9090
return err
9191
}
9292
if err = config.Profile.UseProfile(); err != nil {
@@ -132,7 +132,7 @@ func GuestLogin(config *config.Config) (string, error) {
132132
config.Profile.TeamID = response.TeamID
133133
config.Profile.TeamMode = response.TeamMode
134134

135-
if err = config.Profile.SaveProfile(); err != nil {
135+
if err = config.Profile.SaveProfile(false); err != nil {
136136
return "", err
137137
}
138138
if err = config.Profile.UseProfile(); err != nil {
@@ -172,7 +172,7 @@ func CILogin(config *config.Config, apiKey string, name string) error {
172172
config.Profile.TeamID = response.TeamID
173173
config.Profile.TeamMode = response.TeamMode
174174

175-
if err = config.Profile.SaveProfile(); err != nil {
175+
if err = config.Profile.SaveProfile(false); err != nil {
176176
return err
177177
}
178178
if err = config.Profile.UseProfile(); err != nil {

pkg/login/interactive_login.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ func InteractiveLogin(config *config.Config) error {
6666
config.Profile.TeamMode = response.TeamMode
6767
config.Profile.TeamID = response.TeamID
6868

69-
if err = config.Profile.SaveProfile(); err != nil {
69+
if err = config.Profile.SaveProfile(false); err != nil {
7070
ansi.StopSpinner(s, "", os.Stdout)
7171
return err
7272
}

0 commit comments

Comments
 (0)