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)
}
// 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 {
// 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 {
// 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 {
// 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 {
// 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 {
// 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 {
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)
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)
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)
// 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