pkg: fix SetFlagsFromEnv behaviour

This function was fundamentally buggy, as a panic could be trivially
triggered by setting the wrong environment variable (e.g.
ETCD_BIND_ADDR=foo). Instead, let's propagate the error and present it
to the user in a cleaner way.
This commit is contained in:
Jonathan Boulle
2014-11-06 14:39:30 -08:00
parent 087e0e8b62
commit 321d65c4ac
3 changed files with 21 additions and 7 deletions

View File

@@ -85,7 +85,7 @@ func UsageWithIgnoredFlagsFunc(fs *flag.FlagSet, ignore []string) func() {
// environment variables. Environment variables take the name of the flag but
// are UPPERCASE, have the prefix "ETCD_", and any dashes are replaced by
// underscores - for example: some-flag => ETCD_SOME_FLAG
func SetFlagsFromEnv(fs *flag.FlagSet) {
func SetFlagsFromEnv(fs *flag.FlagSet) (err error) {
alreadySet := make(map[string]bool)
fs.Visit(func(f *flag.Flag) {
alreadySet[f.Name] = true
@@ -95,13 +95,13 @@ func SetFlagsFromEnv(fs *flag.FlagSet) {
key := "ETCD_" + strings.ToUpper(strings.Replace(f.Name, "-", "_", -1))
val := os.Getenv(key)
if val != "" {
if err := fs.Set(f.Name, val); err != nil {
// Should never happen
log.Panicf("error setting flag from env: %v", err)
if serr := fs.Set(f.Name, val); serr != nil {
err = fmt.Errorf("invalid value %q for %s: %v", val, key, serr)
}
}
}
})
return
}
// URLsFromFlags decides what URLs should be using two different flags