Skip to content

Commit 920a73c

Browse files
authored
Merge pull request #646 from dgageot/remove-fsnotify
Remove fsnotify
2 parents cc6c132 + 4762128 commit 920a73c

File tree

14 files changed

+13
-1921
lines changed

14 files changed

+13
-1921
lines changed

Gopkg.lock

+1-7
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Gopkg.toml

-4
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,6 @@
3131
name = "github.com/docker/distribution"
3232
revision = "edc3ab29cdff8694dd6feb85cfeb4b5f1b38ed9c"
3333

34-
[[constraint]]
35-
name = "github.com/fsnotify/fsnotify"
36-
version = "1.4.7"
37-
3834
[[constraint]]
3935
name = "k8s.io/apimachinery"
4036
version = "kubernetes-1.10.0"

pkg/skaffold/watch/watch.go

+12-95
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,13 @@ import (
2121
"fmt"
2222
"io"
2323
"os"
24-
"path/filepath"
2524
"sort"
2625
"time"
2726

28-
"github.com/fsnotify/fsnotify"
2927
"github.com/pkg/errors"
3028
"github.com/sirupsen/logrus"
3129
)
3230

33-
const quietPeriod = 500 * time.Millisecond
34-
3531
// WatcherFactory can build Watchers from a list of files to be watched for changes
3632
type WatcherFactory func(paths []string) (Watcher, error)
3733

@@ -42,20 +38,14 @@ type Watcher interface {
4238
Start(ctx context.Context, out io.Writer, onChange func([]string) error) error
4339
}
4440

45-
// fsWatcher uses inotify to watch for changes and implements
46-
// the Watcher interface
47-
type fsWatcher struct {
48-
watcher *fsnotify.Watcher
49-
files map[string]bool
50-
}
51-
41+
// mtimeWatcher uses polling on file mTimes.
5242
type mtimeWatcher struct {
5343
files map[string]time.Time
5444
}
5545

5646
func (m *mtimeWatcher) Start(ctx context.Context, out io.Writer, onChange func([]string) error) error {
57-
5847
c := time.NewTicker(2 * time.Second)
48+
defer c.Stop()
5949

6050
changedPaths := map[string]bool{}
6151

@@ -94,95 +84,22 @@ func (m *mtimeWatcher) Start(ctx context.Context, out io.Writer, onChange func([
9484

9585
// NewWatcher creates a new Watcher on a list of files.
9686
func NewWatcher(paths []string) (Watcher, error) {
97-
sort.Strings(paths)
87+
logrus.Info("Starting mtime file watcher.")
9888

99-
// Get the watcher type to use, defaulting to mtime.
100-
watcher := os.Getenv("SKAFFOLD_FILE_WATCHER")
101-
if watcher == "" {
102-
watcher = "mtime"
103-
}
89+
sort.Strings(paths)
10490

105-
switch watcher {
106-
case "mtime":
107-
logrus.Info("Starting mtime file watcher.")
108-
files := map[string]time.Time{}
109-
for _, p := range paths {
110-
fi, err := os.Stat(p)
111-
if err != nil {
112-
return nil, err
113-
}
114-
files[p] = fi.ModTime()
115-
}
116-
return &mtimeWatcher{
117-
files: files,
118-
}, nil
119-
case "fsnotify":
120-
logrus.Info("Starting fsnotify file watcher.")
121-
w, err := fsnotify.NewWatcher()
91+
files := map[string]time.Time{}
92+
for _, p := range paths {
93+
fi, err := os.Stat(p)
12294
if err != nil {
123-
return nil, errors.Wrapf(err, "creating watcher")
124-
}
125-
126-
files := map[string]bool{}
127-
128-
for _, p := range paths {
129-
files[p] = true
130-
logrus.Debugf("Added watch for %s", p)
131-
132-
if err := w.Add(p); err != nil {
133-
w.Close()
134-
return nil, errors.Wrapf(err, "adding watch for %s", p)
135-
}
136-
137-
if err := w.Add(filepath.Dir(p)); err != nil {
138-
w.Close()
139-
return nil, errors.Wrapf(err, "adding watch for %s", p)
140-
}
95+
return nil, errors.Wrapf(err, "statting file %s", p)
14196
}
142-
return &fsWatcher{
143-
watcher: w,
144-
files: files,
145-
}, nil
97+
files[p] = fi.ModTime()
14698
}
147-
return nil, fmt.Errorf("unknown watch type: %s", watcher)
148-
}
149-
150-
// Start watches a set of files for changes, and calls `onChange`
151-
// on each file change.
152-
func (f *fsWatcher) Start(ctx context.Context, out io.Writer, onChange func([]string) error) error {
153-
changedPaths := map[string]bool{}
15499

155-
timer := time.NewTimer(1<<63 - 1) // Forever
156-
defer timer.Stop()
157-
158-
for {
159-
select {
160-
case ev := <-f.watcher.Events:
161-
if ev.Op == fsnotify.Chmod {
162-
continue // TODO(dgageot): VSCode seems to chmod randomly
163-
}
164-
if !f.files[ev.Name] {
165-
continue // File is not directly watched. Maybe its parent is
166-
}
167-
timer.Reset(quietPeriod)
168-
logrus.Infof("Change: %s", ev)
169-
changedPaths[ev.Name] = true
170-
case err := <-f.watcher.Errors:
171-
return errors.Wrap(err, "watch error")
172-
case <-timer.C:
173-
changes := sortedPaths(changedPaths)
174-
changedPaths = map[string]bool{}
175-
176-
if err := onChange(changes); err != nil {
177-
return errors.Wrap(err, "change callback")
178-
}
179-
180-
fmt.Fprintln(out, "Watching for changes...")
181-
case <-ctx.Done():
182-
f.watcher.Close()
183-
return nil
184-
}
185-
}
100+
return &mtimeWatcher{
101+
files: files,
102+
}, nil
186103
}
187104

188105
func sortedPaths(changedPaths map[string]bool) []string {

pkg/skaffold/watch/watch_test.go

-3
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import (
1919
"context"
2020
"fmt"
2121
"io/ioutil"
22-
"os"
2322
"path/filepath"
2423
"testing"
2524

@@ -63,8 +62,6 @@ func TestWatch(t *testing.T) {
6362
for _, watcher := range watchers {
6463
for _, test := range tests {
6564
t.Run(fmt.Sprintf("%s %s", test.description, watcher), func(t *testing.T) {
66-
os.Setenv("SKAFFOLD_FILE_WATCHER", watcher)
67-
defer os.Setenv("SKAFFOLD_FILE_WATCHER", "")
6865
tmp, teardown := testutil.TempDir(t)
6966
defer teardown()
7067

vendor/github.com/fsnotify/fsnotify/AUTHORS

-52
This file was deleted.

vendor/github.com/fsnotify/fsnotify/LICENSE

-28
This file was deleted.

vendor/github.com/fsnotify/fsnotify/fen.go

-37
This file was deleted.

vendor/github.com/fsnotify/fsnotify/fsnotify.go

-66
This file was deleted.

0 commit comments

Comments
 (0)