mirror of
https://github.com/safedep/pmg.git
synced 2026-08-03 07:24:09 +02:00
* feat: Add support for sandbox edit command * docs: Update sandbox docs * fix(editor): address review — neutral failure wording, skip sh-script tests on Windows Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix(test): avoid pnpm init in pm-e2e — devEngines.packageManager crashes subsequent pnpm add Same workaround and rationale as the PNPM job in pmg-e2e.yml. Latest pnpm (unpinned pnpm/action-setup) writes devEngines.packageManager with onFail:download on init, and the next add fails with "Cannot use 'in' operator to search for 'integrity' in undefined". Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
102 lines
2.3 KiB
Go
102 lines
2.3 KiB
Go
package config
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
|
|
appConfig "github.com/safedep/pmg/config"
|
|
"github.com/safedep/pmg/internal/editor"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
func NewConfigCommand() *cobra.Command {
|
|
cmd := &cobra.Command{
|
|
Use: "config",
|
|
Short: "View and modify PMG configuration",
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
return cmd.Help()
|
|
},
|
|
}
|
|
|
|
cmd.AddCommand(newGetCommand())
|
|
cmd.AddCommand(newSetCommand())
|
|
cmd.AddCommand(newEditCommand())
|
|
|
|
return cmd
|
|
}
|
|
|
|
func newGetCommand() *cobra.Command {
|
|
return &cobra.Command{
|
|
Use: "get <key>",
|
|
Short: "Get a config value by dot-notation key (output is JSON)",
|
|
Args: cobra.ExactArgs(1),
|
|
SilenceUsage: true,
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
value, err := appConfig.GetConfigValue(args[0])
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
data, err := json.Marshal(value)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to marshal value: %w", err)
|
|
}
|
|
|
|
_, err = fmt.Fprintln(cmd.OutOrStdout(), string(data))
|
|
return err
|
|
},
|
|
}
|
|
}
|
|
|
|
func newSetCommand() *cobra.Command {
|
|
return &cobra.Command{
|
|
Use: "set <key> <value>",
|
|
Short: "Set a config value by dot-notation key",
|
|
Args: cobra.ExactArgs(2),
|
|
SilenceUsage: true,
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
return appConfig.SetConfigValue(args[0], args[1])
|
|
},
|
|
}
|
|
}
|
|
|
|
func newEditCommand() *cobra.Command {
|
|
return &cobra.Command{
|
|
Use: "edit",
|
|
Short: "Open the PMG config file in your default editor",
|
|
Long: `Open the PMG config file in your default editor.
|
|
|
|
The editor is resolved in this order:
|
|
1. $VISUAL
|
|
2. $EDITOR
|
|
3. Platform default (vi on Unix, notepad on Windows)
|
|
|
|
If the config file does not exist, a template is created first.`,
|
|
SilenceUsage: true,
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
return runEdit()
|
|
},
|
|
}
|
|
}
|
|
|
|
func runEdit() error {
|
|
cfg := appConfig.Get()
|
|
if cfg.IsManaged() {
|
|
return appConfig.NewManagedConfigError()
|
|
}
|
|
|
|
path := cfg.ConfigFilePath()
|
|
|
|
if _, err := os.Stat(path); errors.Is(err, os.ErrNotExist) {
|
|
if err := appConfig.WriteTemplateConfig(); err != nil {
|
|
return fmt.Errorf("failed to create config file: %w", err)
|
|
}
|
|
} else if err != nil {
|
|
return fmt.Errorf("failed to stat config file %q: %w", path, err)
|
|
}
|
|
|
|
return editor.Open(path)
|
|
}
|