Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 17 additions & 26 deletions cmd/context/create.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,36 +46,27 @@ func NewCreateCmd(flags *flags.GlobalFlags) *cobra.Command {

// Run runs the command logic.
func (cmd *CreateCmd) Run(ctx context.Context, context string) error {
devsyConfig, err := config.LoadConfig("", cmd.Provider)
if err != nil {
return err
} else if devsyConfig.Contexts[context] != nil {
return fmt.Errorf("context %q already exists", context)
}

// verify name
if provider2.ProviderNameRegEx.MatchString(context) {
return fmt.Errorf("context name can only include lower case letters, numbers or dashes")
} else if len(context) > 48 {
return fmt.Errorf("context name cannot be longer than 48 characters")
}
devsyConfig.Contexts[context] = &config.ContextConfig{}
return config.UpdateConfig("", cmd.Provider, func(devsyConfig *config.Config) error {
if devsyConfig.Contexts[context] != nil {
return fmt.Errorf("context %q already exists", context)
}

// check if there are create options set
if len(cmd.Options) > 0 {
err = setOptions(devsyConfig, context, cmd.Options)
if err != nil {
return err
if provider2.ProviderNameRegEx.MatchString(context) {
return fmt.Errorf("context name can only include lower case letters, numbers or dashes")
} else if len(context) > 48 {
return fmt.Errorf("context name cannot be longer than 48 characters")
}
}
devsyConfig.Contexts[context] = &config.ContextConfig{}

devsyConfig.DefaultContext = context
err = config.SaveConfig(devsyConfig)
if err != nil {
return fmt.Errorf("save config: %w", err)
}
if len(cmd.Options) > 0 {
if err := setOptions(devsyConfig, context, cmd.Options); err != nil {
return err
}
}

return nil
devsyConfig.DefaultContext = context
return nil
})
}

func setOptions(devsyConfig *config.Config, context string, options []string) error {
Expand Down
42 changes: 19 additions & 23 deletions cmd/context/delete.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,31 +44,27 @@ func NewDeleteCmd(flags *flags.GlobalFlags) *cobra.Command {

// Run runs the command logic.
func (cmd *DeleteCmd) Run(ctx context.Context, context string) error {
devsyConfig, err := config.LoadConfig(context, cmd.Provider)
if err != nil {
return err
}

if context == "" {
context = devsyConfig.DefaultContext
} else if devsyConfig.Contexts[context] == nil {
return fmt.Errorf("context %q doesn't exist", context)
}

if context == "default" {
return fmt.Errorf("cannot delete 'default' context")
}
err := config.UpdateConfig(context, cmd.Provider, func(devsyConfig *config.Config) error {
if context == "" {
context = devsyConfig.DefaultContext
} else if devsyConfig.Contexts[context] == nil {
return fmt.Errorf("context %q doesn't exist", context)
}

if err := deleteContextSecrets(devsyConfig, context); err != nil {
return err
}
if context == config.DefaultContext {
return fmt.Errorf("cannot delete 'default' context")
}

delete(devsyConfig.Contexts, context)
resetContextReferences(devsyConfig, context)
if err := deleteContextSecrets(devsyConfig, context); err != nil {
return err
}

err = config.SaveConfig(devsyConfig)
delete(devsyConfig.Contexts, context)
resetContextReferences(devsyConfig, context)
return nil
})
if err != nil {
return fmt.Errorf("save config: %w", err)
return err
}

return removeContextDir(context)
Expand All @@ -91,10 +87,10 @@ func removeContextDir(contextName string) error {

func resetContextReferences(devsyConfig *config.Config, context string) {
if devsyConfig.DefaultContext == context {
devsyConfig.DefaultContext = "default"
devsyConfig.DefaultContext = config.DefaultContext
}
if devsyConfig.OriginalContext == context {
devsyConfig.OriginalContext = "default"
devsyConfig.OriginalContext = config.DefaultContext
}
}

Expand Down
35 changes: 12 additions & 23 deletions cmd/context/set_options.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,30 +50,19 @@ func NewSetOptionsCmd(flags *flags.GlobalFlags) *cobra.Command {

// Run runs the command logic.
func (cmd *SetOptionsCmd) Run(ctx context.Context, context string) error {
devsyConfig, err := config.LoadConfig("", cmd.Provider)
if err != nil {
return err
}

// check for context
if context == "" {
context = devsyConfig.DefaultContext
} else if devsyConfig.Contexts[context] == nil {
return fmt.Errorf("context %q doesn't exist", context)
}

// check if there are setOptions options set
if len(cmd.Options) > 0 {
err = setOptions(devsyConfig, context, cmd.Options)
if err != nil {
return err
return config.UpdateConfig("", cmd.Provider, func(devsyConfig *config.Config) error {
if context == "" {
context = devsyConfig.DefaultContext
} else if devsyConfig.Contexts[context] == nil {
return fmt.Errorf("context %q doesn't exist", context)
}
}

err = config.SaveConfig(devsyConfig)
if err != nil {
return fmt.Errorf("save config: %w", err)
}
if len(cmd.Options) > 0 {
if err := setOptions(devsyConfig, context, cmd.Options); err != nil {
return err
}
}

return nil
return nil
})
}
30 changes: 11 additions & 19 deletions cmd/context/use.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,26 +45,18 @@ func NewUseCmd(flags *flags.GlobalFlags) *cobra.Command {

// Run runs the command logic.
func (cmd *UseCmd) Run(ctx context.Context, context string) error {
devsyConfig, err := config.LoadConfig("", cmd.Provider)
if err != nil {
return err
} else if devsyConfig.Contexts[context] == nil {
return fmt.Errorf("context %q doesn't exist", context)
}

// check if there are use options set
if len(cmd.Options) > 0 {
err = setOptions(devsyConfig, context, cmd.Options)
if err != nil {
return err
return config.UpdateConfig("", cmd.Provider, func(devsyConfig *config.Config) error {
if devsyConfig.Contexts[context] == nil {
return fmt.Errorf("context %q doesn't exist", context)
}
}

devsyConfig.DefaultContext = context
err = config.SaveConfig(devsyConfig)
if err != nil {
return fmt.Errorf("save config: %w", err)
}
if len(cmd.Options) > 0 {
if err := setOptions(devsyConfig, context, cmd.Options); err != nil {
return err
}
}

return nil
devsyConfig.DefaultContext = context
return nil
})
}
16 changes: 3 additions & 13 deletions cmd/ide/set.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,23 +55,13 @@ with 'devsy ide list'.`,

// Run runs the command logic.
func (cmd *SetCmd) Run(_ context.Context, ideName string) error {
devsyConfig, err := config.LoadConfig(cmd.Context, cmd.Provider)
if err != nil {
return err
}

ideName = strings.ToLower(ideName)
ideOptions, err := ideparse.GetIDEOptions(ideName)
if err != nil {
return err
}

if err := setOptions(devsyConfig, ideName, cmd.Options, ideOptions); err != nil {
return err
}

if err := config.SaveConfig(devsyConfig); err != nil {
return fmt.Errorf("save config: %w", err)
}
return nil
return config.UpdateConfig(cmd.Context, cmd.Provider, func(devsyConfig *config.Config) error {
return setOptions(devsyConfig, ideName, cmd.Options, ideOptions)
})
}
24 changes: 9 additions & 15 deletions cmd/ide/use.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package ide

import (
"context"
"fmt"
"maps"
"strings"

Expand Down Expand Up @@ -52,29 +51,24 @@ Available IDEs can be listed with 'devsy ide list'`,

// Run runs the command logic.
func (cmd *UseCmd) Run(ctx context.Context, ide string) error {
devsyConfig, err := config.LoadConfig(cmd.Context, cmd.Provider)
if err != nil {
return err
}

ide = strings.ToLower(ide)
ideOptions, err := ideparse.GetIDEOptions(ide)
if err != nil {
return err
}

// check if there are user options set
if len(cmd.Options) > 0 {
err = setOptions(devsyConfig, ide, cmd.Options, ideOptions)
if err != nil {
return err
err = config.UpdateConfig(cmd.Context, cmd.Provider, func(devsyConfig *config.Config) error {
if len(cmd.Options) > 0 {
if err := setOptions(devsyConfig, ide, cmd.Options, ideOptions); err != nil {
return err
}
}
}

devsyConfig.Current().DefaultIDE = ide
err = config.SaveConfig(devsyConfig)
devsyConfig.Current().DefaultIDE = ide
return nil
})
if err != nil {
return fmt.Errorf("save config: %w", err)
return err
}

log.Infof("default IDE set to %q", ide)
Expand Down
11 changes: 6 additions & 5 deletions cmd/mcp/tools_provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,11 @@ func runProviderAdd(ctx context.Context, g *flags.GlobalFlags, in providerAddInp
}

func runProviderDelete(ctx context.Context, g *flags.GlobalFlags, name string) error {
unlock, err := config.LockConfig()
if err != nil {
return err
}
defer unlock()
devsyConfig, err := config.LoadConfig(g.Context, g.Provider)
if err != nil {
return err
Expand All @@ -150,9 +155,5 @@ func runProviderDelete(ctx context.Context, g *flags.GlobalFlags, name string) e
}

func runProviderUse(_ context.Context, g *flags.GlobalFlags, name string) error {
devsyConfig, err := config.LoadConfig(g.Context, g.Provider)
if err != nil {
return err
}
return cmdprovider.UseProvider(devsyConfig, name)
return cmdprovider.UseProvider(g.Context, g.Provider, name)
}
28 changes: 23 additions & 5 deletions cmd/pro/login.go
Original file line number Diff line number Diff line change
Expand Up @@ -108,17 +108,29 @@ func (cmd *LoginCmd) Run(ctx context.Context, fullURL string) error {
return err
}

devsyConfig, currentInstance, err := cmd.resolveInstance(fullURL)
devsyConfig, err := cmd.prepareProvider(ctx, fullURL)
if err != nil {
return err
}

devsyConfig, err = cmd.ensureProvider(ctx, devsyConfig, currentInstance, fullURL)
return cmd.loginAndConfigure(ctx, devsyConfig, fullURL)
}

// prepareProvider applies the login-related config changes under the config
// lock; the interactive browser login itself runs unlocked.
func (cmd *LoginCmd) prepareProvider(ctx context.Context, fullURL string) (*config.Config, error) {
unlock, err := config.LockConfig()
if err != nil {
return err
return nil, err
}
defer unlock()

return cmd.loginAndConfigure(ctx, devsyConfig, fullURL)
devsyConfig, currentInstance, err := cmd.resolveInstance(fullURL)
if err != nil {
return nil, err
}

return cmd.ensureProvider(ctx, devsyConfig, currentInstance, fullURL)
}

func (cmd *LoginCmd) normalizeURL(fullURL string) (string, error) {
Expand Down Expand Up @@ -279,8 +291,14 @@ func (cmd *LoginCmd) loginAndConfigure(
}

if cmd.Use {
unlock, err := config.LockConfig()
if err != nil {
return err
}
defer unlock()

// Post-login: preserve user values; resolver prunes anything stale.
err := providercmd.ConfigureProvider(ctx, providercmd.ProviderOptionsConfig{
err = providercmd.ConfigureProvider(ctx, providercmd.ProviderOptionsConfig{
Provider: providerConfig,
ContextName: devsyConfig.DefaultContext,
UserOptions: cmd.Options,
Expand Down
13 changes: 11 additions & 2 deletions cmd/pro/logout.go
Original file line number Diff line number Diff line change
Expand Up @@ -118,8 +118,17 @@ func (cmd *LogoutCmd) Run(ctx context.Context, args []string) error {
}
}

// delete the provider config
err = providercmd.DeleteProviderConfig(devsyConfig, proInstanceConfig.Provider, true)
// delete the provider config, reloading it under the config lock: the
// earlier load in this flow predates the daemon shutdown above
unlock, err := config.LockConfig()
if err != nil {
return err
}
freshConfig, err := config.LoadConfig(devsyConfig.DefaultContext, "")
if err == nil {
err = providercmd.DeleteProviderConfig(freshConfig, proInstanceConfig.Provider, true)
}
unlock()
if err != nil {
return err
}
Expand Down
6 changes: 6 additions & 0 deletions cmd/pro/update_provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,12 @@ func (cmd *UpdateProviderCmd) Run(ctx context.Context, args []string) error {
}
newVersion := args[0]

unlock, err := config.LockConfig()
if err != nil {
return err
}
defer unlock()

devsyConfig, err := config.LoadConfig(cmd.Context, cmd.Provider)
if err != nil {
return err
Expand Down
6 changes: 6 additions & 0 deletions cmd/provider/add.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,12 @@ func NewAddCmd(f *flags.GlobalFlags) *cobra.Command {
},
RunE: func(cobraCmd *cobra.Command, args []string) error {
ctx := cobraCmd.Context()
unlock, err := config.LockConfig()
if err != nil {
return err
}
defer unlock()

devsyConfig, err := config.LoadConfig(cmd.Context, cmd.Provider)
if err != nil {
return err
Expand Down
Loading
Loading