mirror of https://github.com/docker/compose.git
watch: fix a segfault on linux (#148)
This commit is contained in:
parent
664e6f6f23
commit
3850a34114
|
@ -240,6 +240,39 @@ func TestSingleFile(t *testing.T) {
|
||||||
f.assertEvents(path)
|
f.assertEvents(path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestWriteBrokenLink(t *testing.T) {
|
||||||
|
f := newNotifyFixture(t)
|
||||||
|
defer f.tearDown()
|
||||||
|
|
||||||
|
link := filepath.Join(f.watched.Path(), "brokenLink")
|
||||||
|
missingFile := filepath.Join(f.watched.Path(), "missingFile")
|
||||||
|
err := os.Symlink(missingFile, link)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
f.assertEvents(link)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestWriteGoodLink(t *testing.T) {
|
||||||
|
f := newNotifyFixture(t)
|
||||||
|
defer f.tearDown()
|
||||||
|
|
||||||
|
goodFile := filepath.Join(f.watched.Path(), "goodFile")
|
||||||
|
err := ioutil.WriteFile(goodFile, []byte("hello"), 0644)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
link := filepath.Join(f.watched.Path(), "goodFileSymlink")
|
||||||
|
err = os.Symlink(goodFile, link)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
f.assertEvents(goodFile, link)
|
||||||
|
}
|
||||||
|
|
||||||
type notifyFixture struct {
|
type notifyFixture struct {
|
||||||
t *testing.T
|
t *testing.T
|
||||||
root *TempDir
|
root *TempDir
|
||||||
|
|
|
@ -79,7 +79,17 @@ func (d *linuxNotify) Errors() chan error {
|
||||||
|
|
||||||
func (d *linuxNotify) loop() {
|
func (d *linuxNotify) loop() {
|
||||||
for e := range d.events {
|
for e := range d.events {
|
||||||
if e.Op&fsnotify.Create == fsnotify.Create && isDir(e.Name) {
|
isCreateOp := e.Op&fsnotify.Create == fsnotify.Create
|
||||||
|
shouldWalk := false
|
||||||
|
if isCreateOp {
|
||||||
|
isDir, err := isDir(e.Name)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error stat-ing file %s: %s", e.Name, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
shouldWalk = isDir
|
||||||
|
}
|
||||||
|
if shouldWalk {
|
||||||
err := filepath.Walk(e.Name, func(path string, mode os.FileInfo, err error) error {
|
err := filepath.Walk(e.Name, func(path string, mode os.FileInfo, err error) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -140,10 +150,14 @@ func NewWatcher() (*linuxNotify, error) {
|
||||||
return wmw, nil
|
return wmw, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func isDir(pth string) bool {
|
func isDir(pth string) (bool, error) {
|
||||||
fi, _ := os.Stat(pth)
|
fi, err := os.Lstat(pth)
|
||||||
|
if os.IsNotExist(err) {
|
||||||
return fi.IsDir()
|
return false, nil
|
||||||
|
} else if err != nil {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
return fi.IsDir(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkInotifyLimits() error {
|
func checkInotifyLimits() error {
|
||||||
|
|
Loading…
Reference in New Issue