diff --git a/viper.go b/viper.go index 72230f5..8284149 100644 --- a/viper.go +++ b/viper.go @@ -260,6 +260,7 @@ func (v *Viper) OnConfigChange(run func(in fsnotify.Event)) { } func WatchConfig() { v.WatchConfig() } + func (v *Viper) WatchConfig() { initWG := sync.WaitGroup{} initWG.Add(1) @@ -294,8 +295,9 @@ func (v *Viper) WatchConfig() { // we only care about the config file with the following cases: // 1 - if the config file was modified or created // 2 - if the real path to the config file changed (eg: k8s ConfigMap replacement) + const writeOrCreateMask = fsnotify.Write | fsnotify.Create if (filepath.Clean(event.Name) == configFile && - (event.Op&fsnotify.Write == fsnotify.Write || event.Op&fsnotify.Create == fsnotify.Create)) || + event.Op&writeOrCreateMask != 0) || (currentConfigFile != "" && currentConfigFile != realConfigFile) { realConfigFile = currentConfigFile err := v.ReadInConfig() @@ -306,7 +308,7 @@ func (v *Viper) WatchConfig() { v.onConfigChange(event) } } else if filepath.Clean(event.Name) == configFile && - event.Op&fsnotify.Remove == fsnotify.Remove { + event.Op&fsnotify.Remove&fsnotify.Remove != 0 { eventsWG.Done() return } @@ -324,6 +326,7 @@ func (v *Viper) WatchConfig() { initWG.Done() // done initalizing the watch in this go routine, so the parent routine can move on... eventsWG.Wait() // now, wait for event loop to end in this go-routine... }() + fmt.Println(" init WG done") initWG.Wait() // make sure that the go routine above fully ended before returning } diff --git a/viper_test.go b/viper_test.go index 9961970..0985821 100644 --- a/viper_test.go +++ b/viper_test.go @@ -1426,12 +1426,12 @@ func TestWatchFile(t *testing.T) { fmt.Printf("test config file: %s\n", configFile) defer cleanup() wg := sync.WaitGroup{} + wg.Add(1) v.WatchConfig() v.OnConfigChange(func(in fsnotify.Event) { t.Logf("config file changed") wg.Done() }) - wg.Add(1) // when overwriting the file and waiting for the custom change notification handler to be triggered err := ioutil.WriteFile(configFile, []byte("foo: baz\n"), 0640) wg.Wait()