From: Nathan Youngman Date: Fri, 13 Jun 2014 04:50:14 +0000 (-0600) Subject: Op constants and Event.Op X-Git-Tag: v1.7.2~312^2~3 X-Git-Url: https://go.fuhry.dev/?a=commitdiff_plain;h=21b433c1e8005dfd581842504c68d945c279e634;p=fsnotify.git Op constants and Event.Op --- diff --git a/fsnotify.go b/fsnotify.go index 8f51a3c..22e105e 100644 --- a/fsnotify.go +++ b/fsnotify.go @@ -7,6 +7,18 @@ package fsnotify import "fmt" +// Op describes a set of file operations. +type Op uint32 + +// These are the file operations that can trigger a notification. +const ( + Create Op = 1 << iota + Write + Remove + Rename + Chmod +) + // Add starts watching for operations on the named file. func (w *Watcher) Add(path string) error { return w.watch(path) @@ -18,28 +30,28 @@ func (w *Watcher) Remove(path string) error { } // String formats the event e in the form -// "filename: DELETE|MODIFY|..." +// "filename: REMOVE|WRITE|..." func (e *Event) String() string { var events string = "" - if e.IsCreate() { + if e.Op&Create == Create { events += "|" + "CREATE" } - if e.IsDelete() { - events += "|" + "DELETE" + if e.Op&Remove == Remove { + events += "|" + "REMOVE" } - if e.IsModify() { - events += "|" + "MODIFY" + if e.Op&Write == Write { + events += "|" + "WRITE" } - if e.IsRename() { + if e.Op&Rename == Rename { events += "|" + "RENAME" } - if e.IsAttrib() { - events += "|" + "ATTRIB" + if e.Op&Chmod == Chmod { + events += "|" + "CHMOD" } if len(events) > 0 { diff --git a/fsnotify_bsd.go b/fsnotify_bsd.go index 08e8bfa..0b38d1d 100644 --- a/fsnotify_bsd.go +++ b/fsnotify_bsd.go @@ -34,7 +34,8 @@ const ( ) type Event struct { - Name string // File name (optional) + Name string // Relative path to the file/directory. + Op Op // Platform-independent bitmask. mask uint32 // Mask of events create bool // set by fsnotify package if found new file } @@ -44,6 +45,21 @@ func newEvent(name string, mask uint32, create bool) *Event { e.Name = name e.mask = mask e.create = create + if e.IsCreate() { + e.Op |= Create + } + if e.IsDelete() { + e.Op |= Remove + } + if e.IsModify() { + e.Op |= Write + } + if e.IsRename() { + e.Op |= Rename + } + if e.IsAttrib() { + e.Op |= Chmod + } return e } diff --git a/fsnotify_linux.go b/fsnotify_linux.go index 7426187..e7ca838 100644 --- a/fsnotify_linux.go +++ b/fsnotify_linux.go @@ -57,7 +57,8 @@ const ( ) type Event struct { - Name string // File name (optional) + Name string // Relative path to the file/directory. + Op Op // Platform-independent bitmask. mask uint32 // Mask of events cookie uint32 // Unique cookie associating related events (for rename(2)) } @@ -67,6 +68,21 @@ func newEvent(name string, mask uint32, cookie uint32) *Event { e.Name = name e.mask = mask e.cookie = cookie + if e.IsCreate() { + e.Op |= Create + } + if e.IsDelete() { + e.Op |= Remove + } + if e.IsModify() { + e.Op |= Write + } + if e.IsRename() { + e.Op |= Rename + } + if e.IsAttrib() { + e.Op |= Chmod + } return e } diff --git a/fsnotify_symlink_test.go b/fsnotify_symlink_test.go index 21253f9..b5354b5 100644 --- a/fsnotify_symlink_test.go +++ b/fsnotify_symlink_test.go @@ -34,7 +34,7 @@ func TestFsnotifyFakeSymlink(t *testing.T) { go func() { for ev := range watcher.Events { t.Logf("event received: %s", ev) - if ev.IsCreate() { + if ev.Op&Create == Create { createEventsReceived.increment() } else { otherEventsReceived.increment() diff --git a/fsnotify_test.go b/fsnotify_test.go index d9541f2..b4240f3 100644 --- a/fsnotify_test.go +++ b/fsnotify_test.go @@ -89,16 +89,16 @@ func TestFsnotifyMultipleOperations(t *testing.T) { // Only count relevant events if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testFile) { t.Logf("event received: %s", event) - if event.IsDelete() { + if event.Op&Remove == Remove { deleteReceived.increment() } - if event.IsModify() { + if event.Op&Write == Write { modifyReceived.increment() } - if event.IsCreate() { + if event.Op&Create == Create { createReceived.increment() } - if event.IsRename() { + if event.Op&Rename == Rename { renameReceived.increment() } } else { @@ -202,13 +202,13 @@ func TestFsnotifyMultipleCreates(t *testing.T) { // Only count relevant events if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testFile) { t.Logf("event received: %s", event) - if event.IsDelete() { + if event.Op&Remove == Remove { deleteReceived.increment() } - if event.IsCreate() { + if event.Op&Create == Create { createReceived.increment() } - if event.IsModify() { + if event.Op&Write == Write { modifyReceived.increment() } } else { @@ -341,13 +341,13 @@ func TestFsnotifyDirOnly(t *testing.T) { // Only count relevant events if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testFile) || event.Name == filepath.Clean(testFileAlreadyExists) { t.Logf("event received: %s", event) - if event.IsDelete() { + if event.Op&Remove == Remove { deleteReceived.increment() } - if event.IsModify() { + if event.Op&Write == Write { modifyReceived.increment() } - if event.IsCreate() { + if event.Op&Create == Create { createReceived.increment() } } else { @@ -443,7 +443,7 @@ func TestFsnotifyDeleteWatchedDir(t *testing.T) { // Only count relevant events if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testFileAlreadyExists) { t.Logf("event received: %s", event) - if event.IsDelete() { + if event.Op&Remove == Remove { deleteReceived.increment() } } else { @@ -489,10 +489,10 @@ func TestFsnotifySubDir(t *testing.T) { // Only count relevant events if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testSubDir) || event.Name == filepath.Clean(testFile1) { t.Logf("event received: %s", event) - if event.IsCreate() { + if event.Op&Create == Create { createReceived.increment() } - if event.IsDelete() { + if event.Op&Remove == Remove { deleteReceived.increment() } } else { @@ -583,7 +583,7 @@ func TestFsnotifyRename(t *testing.T) { for event := range eventstream { // Only count relevant events if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testFile) || event.Name == filepath.Clean(testFileRenamed) { - if event.IsRename() { + if event.Op&Rename == Rename { renameReceived.increment() } t.Logf("event received: %s", event) @@ -665,7 +665,7 @@ func TestFsnotifyRenameToCreate(t *testing.T) { for event := range eventstream { // Only count relevant events if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testFile) || event.Name == filepath.Clean(testFileRenamed) { - if event.IsCreate() { + if event.Op&Create == Create { createReceived.increment() } t.Logf("event received: %s", event) @@ -879,10 +879,10 @@ func TestFsnotifyAttrib(t *testing.T) { for event := range eventstream { // Only count relevant events if event.Name == filepath.Clean(testDir) || event.Name == filepath.Clean(testFile) { - if event.IsModify() { + if event.Op&Write == Write { modifyReceived.increment() } - if event.IsAttrib() { + if event.Op&Chmod == Chmod { attribReceived.increment() } t.Logf("event received: %s", event) diff --git a/fsnotify_windows.go b/fsnotify_windows.go index d3c3934..501d87d 100644 --- a/fsnotify_windows.go +++ b/fsnotify_windows.go @@ -49,13 +49,30 @@ const ( // Event is the type of the notification messages // received on the watcher's Events channel. type Event struct { - Name string // File name (optional) + Name string // Relative path to the file/directory. + Op Op // Platform-independent bitmask. mask uint32 // Mask of events cookie uint32 // Unique cookie associating related events (for rename) } func newEvent(name string, mask uint32) *Event { - return &Event{mask: mask, Name: name} + e := &Event{mask: mask, Name: name} + if e.IsCreate() { + e.Op |= Create + } + if e.IsDelete() { + e.Op |= Remove + } + if e.IsModify() { + e.Op |= Write + } + if e.IsRename() { + e.Op |= Rename + } + if e.IsAttrib() { + e.Op |= Chmod + } + return e } // IsCreate reports whether the Event was triggered by a creation