return sb.String()
}))
+ // For a list of events for the different OSes, see the test output in https://github.com/bep/fsnotifyeventlister/.
events = h.fileEventsFilter(events)
events = h.fileEventsTranslate(events)
+ eventInfos := h.fileEventsApplyInfo(events)
logger := h.Log
addedContentPaths []*paths.Path
)
- for _, ev := range events {
- removed := false
- added := false
-
- if ev.Op&fsnotify.Remove == fsnotify.Remove {
- removed = true
- }
-
- fi, statErr := h.Fs.Source.Stat(ev.Name)
-
- // Some editors (Vim) sometimes issue only a Rename operation when writing an existing file
- // Sometimes a rename operation means that file has been renamed other times it means
- // it's been updated.
- if ev.Op.Has(fsnotify.Rename) {
- // If the file is still on disk, it's only been updated, if it's not, it's been moved
- if statErr != nil {
- removed = true
- }
- }
- if ev.Op.Has(fsnotify.Create) {
- added = true
- }
-
- isChangedDir := statErr == nil && fi.IsDir()
-
+ for _, ev := range eventInfos {
cpss := h.BaseFs.ResolvePaths(ev.Name)
pss := make([]*paths.Path, len(cpss))
for i, cps := range cpss {
p := cps.Path
- if removed && !paths.HasExt(p) {
+ if ev.removed && !paths.HasExt(p) {
// Assume this is a renamed/removed directory.
// For deletes, we walk up the tree to find the container (e.g. branch bundle),
// so we will catch this even if it is a file without extension.
}
pss[i] = h.Configs.ContentPathParser.Parse(cps.Component, p)
- if added && !isChangedDir && cps.Component == files.ComponentFolderContent {
+ if ev.added && !ev.isChangedDir && cps.Component == files.ComponentFolderContent {
addedContentPaths = append(addedContentPaths, pss[i])
}
}
}
- if removed {
+ if ev.removed {
changedPaths.deleted = append(changedPaths.deleted, pss...)
- } else if isChangedDir {
+ } else if ev.isChangedDir {
changedPaths.changedDirs = append(changedPaths.changedDirs, pss...)
} else {
changedPaths.changedFiles = append(changedPaths.changedFiles, pss...)
"io"
"mime"
"net/url"
+ "os"
"path/filepath"
"runtime"
"sort"
return events[:n]
}
+type fileEventInfo struct {
+ fsnotify.Event
+ fi os.FileInfo
+ added bool
+ removed bool
+ isChangedDir bool
+}
+
+func (h *HugoSites) fileEventsApplyInfo(events []fsnotify.Event) []fileEventInfo {
+ var infos []fileEventInfo
+ for _, ev := range events {
+ removed := false
+ added := false
+
+ if ev.Op&fsnotify.Remove == fsnotify.Remove {
+ removed = true
+ }
+
+ fi, statErr := h.Fs.Source.Stat(ev.Name)
+
+ // Some editors (Vim) sometimes issue only a Rename operation when writing an existing file
+ // Sometimes a rename operation means that file has been renamed other times it means
+ // it's been updated.
+ if ev.Op.Has(fsnotify.Rename) {
+ // If the file is still on disk, it's only been updated, if it's not, it's been moved
+ if statErr != nil {
+ removed = true
+ }
+ }
+ if ev.Op.Has(fsnotify.Create) {
+ added = true
+ }
+
+ isChangedDir := statErr == nil && fi.IsDir()
+
+ infos = append(infos, fileEventInfo{
+ Event: ev,
+ fi: fi,
+ added: added,
+ removed: removed,
+ isChangedDir: isChangedDir,
+ })
+ }
+
+ n := 0
+
+ for _, ev := range infos {
+ // Remove any directories that's also represented by a file.
+ keep := true
+ if ev.isChangedDir {
+ for _, ev2 := range infos {
+ if ev2.fi != nil && !ev2.fi.IsDir() && filepath.Dir(ev2.Name) == ev.Name {
+ keep = false
+ break
+ }
+ }
+ }
+ if keep {
+ infos[n] = ev
+ n++
+ }
+ }
+ infos = infos[:n]
+
+ return infos
+}
+
func (h *HugoSites) fileEventsTranslate(events []fsnotify.Event) []fsnotify.Event {
eventMap := make(map[string][]fsnotify.Event)