diff --git a/core/commands/config.go b/core/commands/config.go index 8ef6dad19..d9eb174b7 100644 --- a/core/commands/config.go +++ b/core/commands/config.go @@ -181,7 +181,7 @@ variable set to your preferred text editor. var configReplaceCmd = &cmds.Command{ Helptext: cmds.HelpText{ - Tagline: "Replaces the config with `file>", + Tagline: "Replaces the config with ", ShortDescription: ` Make sure to back up the config file first if neccessary, this operation can't be undone. diff --git a/docs/fuse.md b/docs/fuse.md index 7e2750021..921905b81 100644 --- a/docs/fuse.md +++ b/docs/fuse.md @@ -65,7 +65,7 @@ ipfs daemon --mount If you wish to allow other users to use the mount points, use the following: ```sh -ipfs config Mounts.FuseAllowOther --bool true +ipfs config Mounts.FuseAllowOther true ipfs daemon --mount ``` diff --git a/repo/fsrepo/fsrepo.go b/repo/fsrepo/fsrepo.go index 4c4735396..dc20b00b4 100644 --- a/repo/fsrepo/fsrepo.go +++ b/repo/fsrepo/fsrepo.go @@ -495,19 +495,54 @@ func (r *FSRepo) SetConfigKey(key string, value interface{}) error { if err != nil { return err } - switch v := value.(type) { - case string: - if i, err := strconv.Atoi(v); err == nil { - value = i - } - } var mapconf map[string]interface{} if err := serialize.ReadConfigFile(filename, &mapconf); err != nil { return err } + + // Get the type of the value associated with the key + oldValue, err := common.MapGetKV(mapconf, key) + ok := true + if err != nil { + // key-value does not exist yet + switch v := value.(type) { + case string: + value, err = strconv.ParseBool(v) + if err != nil { + value, err = strconv.Atoi(v) + if err != nil { + value, err = strconv.ParseFloat(v, 32) + if err != nil { + value = v + } + } + } + default: + } + } else { + switch oldValue.(type) { + case bool: + value, ok = value.(bool) + case int: + value, ok = value.(int) + case float32: + value, ok = value.(float32) + case string: + value, ok = value.(string) + default: + value = value + } + if !ok { + return fmt.Errorf("Wrong config type, expected %T", oldValue) + } + } + if err := common.MapSetKV(mapconf, key, value); err != nil { return err } + + // This step doubles as to validate the map against the struct + // before serialization conf, err := config.FromMap(mapconf) if err != nil { return err