Browse Source

fix(watcher_hub) isHidden checks the length of the watchPath before getting subString of keyPath

Xiang Li 12 years ago
parent
commit
c844fccf2a
2 changed files with 14 additions and 0 deletions
  1. 5 0
      store/watcher_hub.go
  2. 9 0
      store/watcher_hub_test.go

+ 5 - 0
store/watcher_hub.go

@@ -161,6 +161,11 @@ func (wh *watcherHub) clone() *watcherHub {
 // isHidden checks to see if key path is considered hidden to watch path i.e. the
 // last element is hidden or it's within a hidden directory
 func isHidden(watchPath, keyPath string) bool {
+	// When deleting a directory, watchPath might be deeper than the actual keyPath
+	// For example, when deleting /foo we also need to notify watchers on /foo/bar.
+	if len(watchPath) > len(keyPath) {
+		return false
+	}
 	// if watch path is just a "/", after path will start without "/"
 	// add a "/" to deal with the special case when watchPath is "/"
 	afterPath := path.Clean("/" + keyPath[len(watchPath):])

+ 9 - 0
store/watcher_hub_test.go

@@ -40,4 +40,13 @@ func TestIsHidden(t *testing.T) {
 	if !hidden {
 		t.Fatalf("%v should be hidden to %v\n", key, watch)
 	}
+
+	// watch at "/_foo/foo"
+	// key is "/_foo"
+	watch = "_foo/foo"
+	key = "/_foo/"
+	hidden = isHidden(watch, key)
+	if hidden {
+		t.Fatalf("%v should not be hidden to %v\n", key, watch)
+	}
 }