Watch the entire config dir for changes
Then checking the file name in the event handler. This seems to be the only robust way
of handling changes from a single file on multiple platforms and editors.
See #142
diff --git a/viper.go b/viper.go
index 68ebf8c..00049ec 100644
--- a/viper.go
+++ b/viper.go
@@ -237,17 +237,24 @@
}
defer watcher.Close()
+ // we have to watch the entire directory to pick up renames/atomic saves in a cross-platform way
+ configFile := filepath.Clean(v.getConfigFile())
+ configDir, _ := filepath.Split(configFile)
+
done := make(chan bool)
go func() {
for {
select {
case event := <-watcher.Events:
- if event.Op&fsnotify.Write == fsnotify.Write || event.Op&fsnotify.Create == fsnotify.Create {
- err := v.ReadInConfig()
- if err != nil {
- log.Println("error:", err)
+ // we only care about the config file
+ if filepath.Clean(event.Name) == configFile {
+ if event.Op&fsnotify.Write == fsnotify.Write || event.Op&fsnotify.Create == fsnotify.Create {
+ err := v.ReadInConfig()
+ if err != nil {
+ log.Println("error:", err)
+ }
+ v.onConfigChange(event)
}
- v.onConfigChange(event)
}
case err := <-watcher.Errors:
log.Println("error:", err)
@@ -255,7 +262,7 @@
}
}()
- watcher.Add(v.getConfigFile())
+ watcher.Add(configDir)
<-done
}()
}