From bf7cb198ea9e2dfdb9ce5b8dc9fc907c878225f7 Mon Sep 17 00:00:00 2001 From: Juan Batiz-Benet <juan@benet.ai> Date: Thu, 31 Jul 2014 01:08:33 -0700 Subject: [PATCH] config: cleaned up ipfs config cmd --- cmd/ipfs/config.go | 110 +++++++++++++++++++++++++++++--------------- config/config.go | 14 ++++-- config/serialize.go | 4 +- 3 files changed, 85 insertions(+), 43 deletions(-) diff --git a/cmd/ipfs/config.go b/cmd/ipfs/config.go index fe964ea1..8bbf45b2 100644 --- a/cmd/ipfs/config.go +++ b/cmd/ipfs/config.go @@ -1,72 +1,110 @@ package main import ( + "errors" + "github.com/gonuts/flag" "github.com/jbenet/commander" config "github.com/jbenet/go-ipfs/config" u "github.com/jbenet/go-ipfs/util" + "io" "os" "os/exec" ) var cmdIpfsConfig = &commander.Command{ UsageLine: "config", - Short: "See and Edit ipfs options", - Long: `ipfs config - See or Edit ipfs configuration. - - See specific config's values with: - ipfs config datastore.path - Assign a new value with: - ipfs config datastore.path ~/.go-ipfs/datastore - - Open the config file in your editor(from $EDITOR): - ipfs config edit - `, - Run: configCmd, - Subcommands: []*commander.Command{ - cmdIpfsConfigEdit, - }, + Short: "Get/Set ipfs config values", + Long: `ipfs config [<key>] [<value>] - Get/Set ipfs config values. + + ipfs config <key> - Get value of <key> + ipfs config <key> <value> - Set value of <key> to <value> + ipfs config --show - Show config file + ipfs config --edit - Edit config file in $EDITOR + +Examples: + + Get the value of the 'datastore.path' key: + + ipfs config datastore.path + + Set the value of the 'datastore.path' key: + + ipfs config datastore.path ~/.go-ipfs/datastore + +`, + Run: configCmd, + Flag: *flag.NewFlagSet("ipfs-config", flag.ExitOnError), } -var cmdIpfsConfigEdit = &commander.Command{ - UsageLine: "edit", - Short: "Opens the configuration file in the editor.", - Long: `Looks up environment variable $EDITOR and - attempts to open the config file with it. - `, - Run: configEditCmd, +func init() { + cmdIpfsConfig.Flag.Bool("edit", false, "Edit config file in $EDITOR") + cmdIpfsConfig.Flag.Bool("show", false, "Show config file") } func configCmd(c *commander.Command, inp []string) error { + + // todo: implement --config filename flag. + filename, err := config.ConfigFilename("") + if err != nil { + return err + } + + // if editing, open the editor + if c.Flag.Lookup("edit").Value.Get().(bool) { + return configEditor(filename) + } + + // if showing, cat the file + if c.Flag.Lookup("show").Value.Get().(bool) { + return configCat(filename) + } + if len(inp) == 0 { // "ipfs config" run without parameters - u.POut(c.Long + "\n") + u.POut(c.Long) return nil } + // Getter (1 param) if len(inp) == 1 { - // "ipfs config" run without one parameter, so this is a value getter value, err := config.GetValueInConfigFile(inp[0]) if err != nil { - u.POut("Failed to get config value: " + err.Error() + "\n") - } else { - u.POut(value + "\n") + return errors.New("Failed to get config value: " + err.Error()) } + + u.POut(value + "\n") return nil } - // "ipfs config" run without two parameter, so this is a value setter - err := config.SetValueInConfigFile(inp[0], inp[1:]) + // Setter (>1 params) + err = config.SetValueInConfigFile(inp[0], inp[1:]) if err != nil { - u.POut("Failed to set config value: " + err.Error() + "\n") + return errors.New("Failed to set config value: " + err.Error()) } + return nil } -func configEditCmd(c *commander.Command, _ []string) error { - if editor := os.Getenv("EDITOR"); editor == "" { - u.POut("ENVIRON variable $EDITOR is not assigned \n") - } else { - exec.Command("sh", "-c", editor+" "+config.DefaultConfigFilePath).Start() +func configCat(filename string) error { + + file, err := os.Open(filename) + if err != nil { + return err } - return nil + defer file.Close() + + _, err = io.Copy(os.Stdout, file) + return err +} + +func configEditor(filename string) error { + + editor := os.Getenv("EDITOR") + if editor == "" { + return errors.New("ENV variable $EDITOR not set") + } + + cmd := exec.Command("sh", "-c", editor+" "+filename) + cmd.Stdin, cmd.Stdout, cmd.Stderr = os.Stdin, os.Stdout, os.Stderr + return cmd.Run() } diff --git a/config/config.go b/config/config.go index 21420221..0a4a75d9 100644 --- a/config/config.go +++ b/config/config.go @@ -22,7 +22,7 @@ type Config struct { Datastore *Datastore } -var DefaultConfigFilePath = "~/.go-ipfs/config" +var defaultConfigFilePath = "~/.go-ipfs/config" var defaultConfigFile = `{ "identity": {}, "datastore": { @@ -32,14 +32,18 @@ var defaultConfigFile = `{ } ` -// LoadConfig reads given file and returns the read config, or error. -func LoadConfig(filename string) (*Config, error) { +func ConfigFilename(filename string) (string, error) { if len(filename) == 0 { - filename = DefaultConfigFilePath + filename = defaultConfigFilePath } // tilde expansion on config file - filename, err := u.TildeExpansion(filename) + return u.TildeExpansion(filename) +} + +// LoadConfig reads given file and returns the read config, or error. +func LoadConfig(filename string) (*Config, error) { + filename, err := ConfigFilename(filename) if err != nil { return nil, err } diff --git a/config/serialize.go b/config/serialize.go index c4b1c816..fe9889d9 100644 --- a/config/serialize.go +++ b/config/serialize.go @@ -46,7 +46,7 @@ func GetValueInConfigFile(key string) (value string, err error) { // reading config file attrs := strings.Split(key, ".") - filename, _ := u.TildeExpansion(DefaultConfigFilePath) + filename, _ := u.TildeExpansion(defaultConfigFilePath) buf, err := ioutil.ReadFile(filename) if err != nil { return "", err @@ -83,7 +83,7 @@ func SetValueInConfigFile(key string, values []string) error { assignee := strings.Join(values, " ") attrs := strings.Split(key, ".") - filename, _ := u.TildeExpansion(DefaultConfigFilePath) + filename, _ := u.TildeExpansion(defaultConfigFilePath) buf, err := ioutil.ReadFile(filename) if err != nil { return err -- GitLab