summaryrefslogtreecommitdiffstats
path: root/Godeps/_workspace/src/gopkg.in/fsnotify.v1
diff options
context:
space:
mode:
author=Corey Hulen <corey@hulen.com>2015-11-23 15:53:48 -0800
committer=Corey Hulen <corey@hulen.com>2015-11-23 15:53:48 -0800
commit4f4cd5e63573da4d6edcc7d4213afaca67c19f88 (patch)
treecefbc7af53629d97644ca2f6b2369e9d879f0101 /Godeps/_workspace/src/gopkg.in/fsnotify.v1
parentf8a3c9a14edca6df0647d89cf225f2470cbe025c (diff)
downloadchat-4f4cd5e63573da4d6edcc7d4213afaca67c19f88.tar.gz
chat-4f4cd5e63573da4d6edcc7d4213afaca67c19f88.tar.bz2
chat-4f4cd5e63573da4d6edcc7d4213afaca67c19f88.zip
upgrading libs
Diffstat (limited to 'Godeps/_workspace/src/gopkg.in/fsnotify.v1')
-rw-r--r--Godeps/_workspace/src/gopkg.in/fsnotify.v1/.travis.yml9
-rw-r--r--Godeps/_workspace/src/gopkg.in/fsnotify.v1/AUTHORS7
-rw-r--r--Godeps/_workspace/src/gopkg.in/fsnotify.v1/CHANGELOG.md11
-rw-r--r--Godeps/_workspace/src/gopkg.in/fsnotify.v1/NotUsed.xcworkspace0
-rw-r--r--Godeps/_workspace/src/gopkg.in/fsnotify.v1/README.md13
-rw-r--r--Godeps/_workspace/src/gopkg.in/fsnotify.v1/circle.yml26
-rw-r--r--Godeps/_workspace/src/gopkg.in/fsnotify.v1/inotify.go26
-rw-r--r--Godeps/_workspace/src/gopkg.in/fsnotify.v1/inotify_poller.go2
-rw-r--r--Godeps/_workspace/src/gopkg.in/fsnotify.v1/inotify_test.go57
-rw-r--r--Godeps/_workspace/src/gopkg.in/fsnotify.v1/integration_test.go48
-rw-r--r--Godeps/_workspace/src/gopkg.in/fsnotify.v1/kqueue.go48
11 files changed, 190 insertions, 57 deletions
diff --git a/Godeps/_workspace/src/gopkg.in/fsnotify.v1/.travis.yml b/Godeps/_workspace/src/gopkg.in/fsnotify.v1/.travis.yml
index 67467e140..1b5151f12 100644
--- a/Godeps/_workspace/src/gopkg.in/fsnotify.v1/.travis.yml
+++ b/Godeps/_workspace/src/gopkg.in/fsnotify.v1/.travis.yml
@@ -2,10 +2,15 @@ sudo: false
language: go
go:
- - 1.4.1
+ - 1.5.1
before_script:
- - FIXED=$(go fmt ./... | wc -l); if [ $FIXED -gt 0 ]; then echo "gofmt - $FIXED file(s) not formatted correctly, please run gofmt to fix this." && exit 1; fi
+ - go get -u github.com/golang/lint/golint
+
+after_script:
+ - test -z "$(gofmt -s -l -w . | tee /dev/stderr)"
+ - test -z "$(golint ./... | tee /dev/stderr)"
+ - go vet ./...
os:
- linux
diff --git a/Godeps/_workspace/src/gopkg.in/fsnotify.v1/AUTHORS b/Godeps/_workspace/src/gopkg.in/fsnotify.v1/AUTHORS
index 4e0e8284e..763b853c3 100644
--- a/Godeps/_workspace/src/gopkg.in/fsnotify.v1/AUTHORS
+++ b/Godeps/_workspace/src/gopkg.in/fsnotify.v1/AUTHORS
@@ -11,18 +11,22 @@
Adrien Bustany <adrien@bustany.org>
Caleb Spare <cespare@gmail.com>
Case Nelson <case@teammating.com>
-Chris Howey <howeyc@gmail.com> <chris@howey.me>
+Chris Howey <chris@howey.me> <howeyc@gmail.com>
Christoffer Buchholz <christoffer.buchholz@gmail.com>
+Daniel Wagner-Hall <dawagner@gmail.com>
Dave Cheney <dave@cheney.net>
+Evan Phoenix <evan@fallingsnow.net>
Francisco Souza <f@souza.cc>
Hari haran <hariharan.uno@gmail.com>
John C Barstow
Kelvin Fo <vmirage@gmail.com>
+Ken-ichirou MATSUZAWA <chamas@h4.dion.ne.jp>
Matt Layher <mdlayher@gmail.com>
Nathan Youngman <git@nathany.com>
Paul Hammond <paul@paulhammond.org>
Pieter Droogendijk <pieter@binky.org.uk>
Pursuit92 <JoshChase@techpursuit.net>
+Riku Voipio <riku.voipio@linaro.org>
Rob Figueiredo <robfig@gmail.com>
Soge Zhang <zhssoge@gmail.com>
Tilak Sharma <tilaks@google.com>
@@ -32,3 +36,4 @@ Yukang <moorekang@gmail.com>
bronze1man <bronze1man@gmail.com>
debrando <denis.brandolini@gmail.com>
henrikedwards <henrik.edwards@gmail.com>
+铁哥 <guotie.9@gmail.com>
diff --git a/Godeps/_workspace/src/gopkg.in/fsnotify.v1/CHANGELOG.md b/Godeps/_workspace/src/gopkg.in/fsnotify.v1/CHANGELOG.md
index ea9428a2a..4e6672702 100644
--- a/Godeps/_workspace/src/gopkg.in/fsnotify.v1/CHANGELOG.md
+++ b/Godeps/_workspace/src/gopkg.in/fsnotify.v1/CHANGELOG.md
@@ -1,5 +1,16 @@
# Changelog
+## v1.2.5 / 2015-10-17
+
+* inotify: use epoll_create1 for arm64 support (requires Linux 2.6.27 or later) [#100](https://github.com/go-fsnotify/fsnotify/pull/100) (thanks @suihkulokki)
+* inotify: fix path leaks [#73](https://github.com/go-fsnotify/fsnotify/pull/73) (thanks @chamaken)
+* kqueue: watch for rename events on subdirectories [#83](https://github.com/go-fsnotify/fsnotify/pull/83) (thanks @guotie)
+* kqueue: avoid infinite loops from symlinks cycles [#101](https://github.com/go-fsnotify/fsnotify/pull/101) (thanks @illicitonion)
+
+## v1.2.1 / 2015-10-14
+
+* kqueue: don't watch named pipes [#98](https://github.com/go-fsnotify/fsnotify/pull/98) (thanks @evanphx)
+
## v1.2.0 / 2015-02-08
* inotify: use epoll to wake up readEvents [#66](https://github.com/go-fsnotify/fsnotify/pull/66) (thanks @PieterD)
diff --git a/Godeps/_workspace/src/gopkg.in/fsnotify.v1/NotUsed.xcworkspace b/Godeps/_workspace/src/gopkg.in/fsnotify.v1/NotUsed.xcworkspace
deleted file mode 100644
index e69de29bb..000000000
--- a/Godeps/_workspace/src/gopkg.in/fsnotify.v1/NotUsed.xcworkspace
+++ /dev/null
diff --git a/Godeps/_workspace/src/gopkg.in/fsnotify.v1/README.md b/Godeps/_workspace/src/gopkg.in/fsnotify.v1/README.md
index 7a0b24736..f2b432e96 100644
--- a/Godeps/_workspace/src/gopkg.in/fsnotify.v1/README.md
+++ b/Godeps/_workspace/src/gopkg.in/fsnotify.v1/README.md
@@ -1,6 +1,6 @@
# File system notifications for Go
-[![Coverage](http://gocover.io/_badge/github.com/go-fsnotify/fsnotify)](http://gocover.io/github.com/go-fsnotify/fsnotify) [![GoDoc](https://godoc.org/gopkg.in/fsnotify.v1?status.svg)](https://godoc.org/gopkg.in/fsnotify.v1)
+[![GoDoc](https://godoc.org/gopkg.in/fsnotify.v1?status.svg)](https://godoc.org/gopkg.in/fsnotify.v1) [![Coverage](http://gocover.io/_badge/github.com/go-fsnotify/fsnotify)](http://gocover.io/github.com/go-fsnotify/fsnotify)
Go 1.3+ required.
@@ -8,8 +8,8 @@ Cross platform: Windows, Linux, BSD and OS X.
|Adapter |OS |Status |
|----------|----------|----------|
-|inotify |Linux, Android\*|Supported [![Build Status](https://travis-ci.org/go-fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/go-fsnotify/fsnotify)|
-|kqueue |BSD, OS X, iOS\*|Supported [![Circle CI](https://circleci.com/gh/go-fsnotify/fsnotify.svg?style=svg)](https://circleci.com/gh/go-fsnotify/fsnotify)|
+|inotify |Linux 2.6.27 or later, Android\*|Supported [![Build Status](https://travis-ci.org/go-fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/go-fsnotify/fsnotify)|
+|kqueue |BSD, OS X, iOS\*|Supported [![Build Status](https://travis-ci.org/go-fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/go-fsnotify/fsnotify)|
|ReadDirectoryChangesW|Windows|Supported [![Build status](https://ci.appveyor.com/api/projects/status/ivwjubaih4r0udeh/branch/master?svg=true)](https://ci.appveyor.com/project/NathanYoungman/fsnotify/branch/master)|
|FSEvents |OS X |[Planned](https://github.com/go-fsnotify/fsnotify/issues/11)|
|FEN |Solaris 11 |[Planned](https://github.com/go-fsnotify/fsnotify/issues/12)|
@@ -55,5 +55,10 @@ Please refer to [CONTRIBUTING][] before opening an issue or pull request.
See [example_test.go](https://github.com/go-fsnotify/fsnotify/blob/master/example_test.go).
-
[contributing]: https://github.com/go-fsnotify/fsnotify/blob/master/CONTRIBUTING.md
+
+## Related Projects
+
+* [notify](https://github.com/rjeczalik/notify)
+* [fsevents](https://github.com/go-fsnotify/fsevents)
+
diff --git a/Godeps/_workspace/src/gopkg.in/fsnotify.v1/circle.yml b/Godeps/_workspace/src/gopkg.in/fsnotify.v1/circle.yml
deleted file mode 100644
index 204217fb0..000000000
--- a/Godeps/_workspace/src/gopkg.in/fsnotify.v1/circle.yml
+++ /dev/null
@@ -1,26 +0,0 @@
-## OS X build (CircleCI iOS beta)
-
-# Pretend like it's an Xcode project, at least to get it running.
-machine:
- environment:
- XCODE_WORKSPACE: NotUsed.xcworkspace
- XCODE_SCHEME: NotUsed
- # This is where the go project is actually checked out to:
- CIRCLE_BUILD_DIR: $HOME/.go_project/src/github.com/go-fsnotify/fsnotify
-
-dependencies:
- pre:
- - brew upgrade go
-
-test:
- override:
- - go test ./...
-
-# Idealized future config, eventually with cross-platform build matrix :-)
-
-# machine:
-# go:
-# version: 1.4
-# os:
-# - osx
-# - linux
diff --git a/Godeps/_workspace/src/gopkg.in/fsnotify.v1/inotify.go b/Godeps/_workspace/src/gopkg.in/fsnotify.v1/inotify.go
index d7759ec8c..06f4bba88 100644
--- a/Godeps/_workspace/src/gopkg.in/fsnotify.v1/inotify.go
+++ b/Godeps/_workspace/src/gopkg.in/fsnotify.v1/inotify.go
@@ -23,6 +23,7 @@ type Watcher struct {
Events chan Event
Errors chan error
mu sync.Mutex // Map access
+ cv *sync.Cond // sync removing on rm_watch with IN_IGNORE
fd int
poller *fdPoller
watches map[string]*watch // Map of inotify watches (key: path)
@@ -54,6 +55,7 @@ func NewWatcher() (*Watcher, error) {
done: make(chan struct{}),
doneResp: make(chan struct{}),
}
+ w.cv = sync.NewCond(&w.mu)
go w.readEvents()
return w, nil
@@ -134,8 +136,10 @@ func (w *Watcher) Remove(name string) error {
}
// inotify_rm_watch will return EINVAL if the file has been deleted;
// the inotify will already have been removed.
- // That means we can safely delete it from our watches, whatever inotify_rm_watch does.
- delete(w.watches, name)
+ // watches and pathes are deleted in ignoreLinux() implicitly and asynchronously
+ // by calling inotify_rm_watch() below. e.g. readEvents() goroutine receives IN_IGNORE
+ // so that EINVAL means that the wd is being rm_watch()ed or its file removed
+ // by another thread and we have not received IN_IGNORE event.
success, errno := syscall.InotifyRmWatch(w.fd, watch.wd)
if success == -1 {
// TODO: Perhaps it's not helpful to return an error here in every case.
@@ -146,6 +150,14 @@ func (w *Watcher) Remove(name string) error {
// explicitly by inotify_rm_watch, implicitly when the file they are watching is deleted.
return errno
}
+
+ // wait until ignoreLinux() deleting maps
+ exists := true
+ for exists {
+ w.cv.Wait()
+ _, exists = w.watches[name]
+ }
+
return nil
}
@@ -249,7 +261,7 @@ func (w *Watcher) readEvents() {
event := newEvent(name, mask)
// Send the events that are not ignored on the events channel
- if !event.ignoreLinux(mask) {
+ if !event.ignoreLinux(w, raw.Wd, mask) {
select {
case w.Events <- event:
case <-w.done:
@@ -266,9 +278,15 @@ func (w *Watcher) readEvents() {
// Certain types of events can be "ignored" and not sent over the Events
// channel. Such as events marked ignore by the kernel, or MODIFY events
// against files that do not exist.
-func (e *Event) ignoreLinux(mask uint32) bool {
+func (e *Event) ignoreLinux(w *Watcher, wd int32, mask uint32) bool {
// Ignore anything the inotify API says to ignore
if mask&syscall.IN_IGNORED == syscall.IN_IGNORED {
+ w.mu.Lock()
+ defer w.mu.Unlock()
+ name := w.paths[int(wd)]
+ delete(w.paths, int(wd))
+ delete(w.watches, name)
+ w.cv.Broadcast()
return true
}
diff --git a/Godeps/_workspace/src/gopkg.in/fsnotify.v1/inotify_poller.go b/Godeps/_workspace/src/gopkg.in/fsnotify.v1/inotify_poller.go
index 3b4178404..23a5ca146 100644
--- a/Godeps/_workspace/src/gopkg.in/fsnotify.v1/inotify_poller.go
+++ b/Godeps/_workspace/src/gopkg.in/fsnotify.v1/inotify_poller.go
@@ -39,7 +39,7 @@ func newFdPoller(fd int) (*fdPoller, error) {
poller.fd = fd
// Create epoll fd
- poller.epfd, errno = syscall.EpollCreate(1)
+ poller.epfd, errno = syscall.EpollCreate1(0)
if poller.epfd == -1 {
return nil, errno
}
diff --git a/Godeps/_workspace/src/gopkg.in/fsnotify.v1/inotify_test.go b/Godeps/_workspace/src/gopkg.in/fsnotify.v1/inotify_test.go
index 035ee8f95..4b5c4b184 100644
--- a/Godeps/_workspace/src/gopkg.in/fsnotify.v1/inotify_test.go
+++ b/Godeps/_workspace/src/gopkg.in/fsnotify.v1/inotify_test.go
@@ -7,6 +7,7 @@
package fsnotify
import (
+ "fmt"
"os"
"path/filepath"
"syscall"
@@ -281,12 +282,60 @@ func TestInotifyRemoveTwice(t *testing.T) {
}
err = w.Remove(testFile)
- if err != syscall.EINVAL {
- t.Fatalf("Expected EINVAL from Remove, got: %v", err)
+ if err == nil {
+ t.Fatalf("no error on removing invalid file")
}
+ s1 := fmt.Sprintf("%s", err)
err = w.Remove(testFile)
- if err == syscall.EINVAL {
- t.Fatalf("Got EINVAL again, watch was not removed")
+ if err == nil {
+ t.Fatalf("no error on removing invalid file")
+ }
+ s2 := fmt.Sprintf("%s", err)
+
+ if s1 != s2 {
+ t.Fatalf("receive different error - %s / %s", s1, s2)
+ }
+}
+
+func TestInotifyInnerMapLength(t *testing.T) {
+ testDir := tempMkdir(t)
+ defer os.RemoveAll(testDir)
+ testFile := filepath.Join(testDir, "testfile")
+
+ handle, err := os.Create(testFile)
+ if err != nil {
+ t.Fatalf("Create failed: %v", err)
+ }
+ handle.Close()
+
+ w, err := NewWatcher()
+ if err != nil {
+ t.Fatalf("Failed to create watcher: %v", err)
+ }
+ defer w.Close()
+
+ err = w.Add(testFile)
+ if err != nil {
+ t.Fatalf("Failed to add testFile: %v", err)
+ }
+ go func() {
+ for err := range w.Errors {
+ t.Fatalf("error received: %s", err)
+ }
+ }()
+
+ err = os.Remove(testFile)
+ if err != nil {
+ t.Fatalf("Failed to remove testFile: %v", err)
+ }
+ _ = <-w.Events // consume Remove event
+ <-time.After(50 * time.Millisecond) // wait IN_IGNORE propagated
+
+ if len(w.watches) != 0 {
+ t.Fatalf("Expected watches len is 0, but got: %d, %v", len(w.watches), w.watches)
+ }
+ if len(w.paths) != 0 {
+ t.Fatalf("Expected paths len is 0, but got: %d, %v", len(w.paths), w.paths)
}
}
diff --git a/Godeps/_workspace/src/gopkg.in/fsnotify.v1/integration_test.go b/Godeps/_workspace/src/gopkg.in/fsnotify.v1/integration_test.go
index 59169c6af..49e48ff1c 100644
--- a/Godeps/_workspace/src/gopkg.in/fsnotify.v1/integration_test.go
+++ b/Godeps/_workspace/src/gopkg.in/fsnotify.v1/integration_test.go
@@ -10,6 +10,7 @@ import (
"io/ioutil"
"os"
"os/exec"
+ "path"
"path/filepath"
"runtime"
"sync/atomic"
@@ -1065,6 +1066,53 @@ func TestFsnotifyFakeSymlink(t *testing.T) {
watcher.Close()
}
+func TestCyclicSymlink(t *testing.T) {
+ if runtime.GOOS == "windows" {
+ t.Skip("symlinks don't work on Windows.")
+ }
+
+ watcher := newWatcher(t)
+
+ testDir := tempMkdir(t)
+ defer os.RemoveAll(testDir)
+
+ link := path.Join(testDir, "link")
+ if err := os.Symlink(".", link); err != nil {
+ t.Fatalf("could not make symlink: %v", err)
+ }
+ addWatch(t, watcher, testDir)
+
+ var createEventsReceived counter
+ go func() {
+ for ev := range watcher.Events {
+ if ev.Op&Create == Create {
+ createEventsReceived.increment()
+ }
+ }
+ }()
+
+ if err := os.Remove(link); err != nil {
+ t.Fatalf("Error removing link: %v", err)
+ }
+
+ // It would be nice to be able to expect a delete event here, but kqueue has
+ // no way for us to get events on symlinks themselves, because opening them
+ // opens an fd to the file to which they point.
+
+ if err := ioutil.WriteFile(link, []byte("foo"), 0700); err != nil {
+ t.Fatalf("could not make symlink: %v", err)
+ }
+
+ // We expect this event to be received almost immediately, but let's wait 500 ms to be sure
+ time.Sleep(500 * time.Millisecond)
+
+ if got := createEventsReceived.value(); got == 0 {
+ t.Errorf("want at least 1 create event got %v", got)
+ }
+
+ watcher.Close()
+}
+
// TestConcurrentRemovalOfWatch tests that concurrent calls to RemoveWatch do not race.
// See https://codereview.appspot.com/103300045/
// go test -test.run=TestConcurrentRemovalOfWatch -test.cpu=1,1,1,1,1 -race
diff --git a/Godeps/_workspace/src/gopkg.in/fsnotify.v1/kqueue.go b/Godeps/_workspace/src/gopkg.in/fsnotify.v1/kqueue.go
index 265622d20..9662a50a8 100644
--- a/Godeps/_workspace/src/gopkg.in/fsnotify.v1/kqueue.go
+++ b/Godeps/_workspace/src/gopkg.in/fsnotify.v1/kqueue.go
@@ -94,7 +94,8 @@ func (w *Watcher) Add(name string) error {
w.mu.Lock()
w.externalWatches[name] = true
w.mu.Unlock()
- return w.addWatch(name, noteAllEvents)
+ _, err := w.addWatch(name, noteAllEvents)
+ return err
}
// Remove stops watching the the named file or directory (non-recursively).
@@ -153,7 +154,8 @@ var keventWaitTime = durationToTimespec(100 * time.Millisecond)
// addWatch adds name to the watched file set.
// The flags are interpreted as described in kevent(2).
-func (w *Watcher) addWatch(name string, flags uint32) error {
+// Returns the real path to the file which was added, if any, which may be different from the one passed in the case of symlinks.
+func (w *Watcher) addWatch(name string, flags uint32) (string, error) {
var isDir bool
// Make ./name and name equivalent
name = filepath.Clean(name)
@@ -161,7 +163,7 @@ func (w *Watcher) addWatch(name string, flags uint32) error {
w.mu.Lock()
if w.isClosed {
w.mu.Unlock()
- return errors.New("kevent instance already closed")
+ return "", errors.New("kevent instance already closed")
}
watchfd, alreadyWatching := w.watches[name]
// We already have a watch, but we can still override flags.
@@ -173,12 +175,17 @@ func (w *Watcher) addWatch(name string, flags uint32) error {
if !alreadyWatching {
fi, err := os.Lstat(name)
if err != nil {
- return err
+ return "", err
}
// Don't watch sockets.
if fi.Mode()&os.ModeSocket == os.ModeSocket {
- return nil
+ return "", nil
+ }
+
+ // Don't watch named pipes.
+ if fi.Mode()&os.ModeNamedPipe == os.ModeNamedPipe {
+ return "", nil
}
// Follow Symlinks
@@ -190,18 +197,26 @@ func (w *Watcher) addWatch(name string, flags uint32) error {
if fi.Mode()&os.ModeSymlink == os.ModeSymlink {
name, err = filepath.EvalSymlinks(name)
if err != nil {
- return nil
+ return "", nil
+ }
+
+ w.mu.Lock()
+ _, alreadyWatching = w.watches[name]
+ w.mu.Unlock()
+
+ if alreadyWatching {
+ return name, nil
}
fi, err = os.Lstat(name)
if err != nil {
- return nil
+ return "", nil
}
}
watchfd, err = syscall.Open(name, openMode, 0700)
if watchfd == -1 {
- return err
+ return "", err
}
isDir = fi.IsDir()
@@ -210,7 +225,7 @@ func (w *Watcher) addWatch(name string, flags uint32) error {
const registerAdd = syscall.EV_ADD | syscall.EV_CLEAR | syscall.EV_ENABLE
if err := register(w.kq, []int{watchfd}, registerAdd, flags); err != nil {
syscall.Close(watchfd)
- return err
+ return "", err
}
if !alreadyWatching {
@@ -224,6 +239,7 @@ func (w *Watcher) addWatch(name string, flags uint32) error {
// Watch the directory if it has not been watched before,
// or if it was watched before, but perhaps only a NOTE_DELETE (watchDirectoryFiles)
w.mu.Lock()
+
watchDir := (flags&syscall.NOTE_WRITE) == syscall.NOTE_WRITE &&
(!alreadyWatching || (w.dirFlags[name]&syscall.NOTE_WRITE) != syscall.NOTE_WRITE)
// Store flags so this watch can be updated later
@@ -232,11 +248,11 @@ func (w *Watcher) addWatch(name string, flags uint32) error {
if watchDir {
if err := w.watchDirectoryFiles(name); err != nil {
- return err
+ return "", err
}
}
}
- return nil
+ return name, nil
}
// readEvents reads from kqueue and converts the received kevents into
@@ -359,7 +375,8 @@ func (w *Watcher) watchDirectoryFiles(dirPath string) error {
for _, fileInfo := range files {
filePath := filepath.Join(dirPath, fileInfo.Name())
- if err := w.internalWatch(filePath, fileInfo); err != nil {
+ filePath, err = w.internalWatch(filePath, fileInfo)
+ if err != nil {
return err
}
@@ -394,7 +411,8 @@ func (w *Watcher) sendDirectoryChangeEvents(dirPath string) {
}
// like watchDirectoryFiles (but without doing another ReadDir)
- if err := w.internalWatch(filePath, fileInfo); err != nil {
+ filePath, err = w.internalWatch(filePath, fileInfo)
+ if err != nil {
return
}
@@ -404,7 +422,7 @@ func (w *Watcher) sendDirectoryChangeEvents(dirPath string) {
}
}
-func (w *Watcher) internalWatch(name string, fileInfo os.FileInfo) error {
+func (w *Watcher) internalWatch(name string, fileInfo os.FileInfo) (string, error) {
if fileInfo.IsDir() {
// mimic Linux providing delete events for subdirectories
// but preserve the flags used if currently watching subdirectory
@@ -412,7 +430,7 @@ func (w *Watcher) internalWatch(name string, fileInfo os.FileInfo) error {
flags := w.dirFlags[name]
w.mu.Unlock()
- flags |= syscall.NOTE_DELETE
+ flags |= syscall.NOTE_DELETE | syscall.NOTE_RENAME
return w.addWatch(name, flags)
}