summaryrefslogtreecommitdiffstats
path: root/hugolib/site.go
diff options
context:
space:
mode:
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2024-04-16 09:32:08 +0200
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>2024-04-16 12:06:37 +0200
commitfa60a2fbc317aa3b1fcfcaf2e842bdb439b8e7f1 (patch)
tree901e4f0d595f5e22908af979f1b2894a0aea95eb /hugolib/site.go
parentfe63de3a83da351fa9b31498486a2f6538a70bde (diff)
Fix server rebuilds when adding a content file on Linux
Fixes #12362
Diffstat (limited to 'hugolib/site.go')
-rw-r--r--hugolib/site.go66
1 files changed, 35 insertions, 31 deletions
diff --git a/hugolib/site.go b/hugolib/site.go
index 9ab361722..b66a1284b 100644
--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -424,7 +424,35 @@ func (h *HugoSites) fileEventsFilter(events []fsnotify.Event) []fsnotify.Event {
events[n] = ev
n++
}
- return events[:n]
+ events = events[:n]
+
+ eventOrdinal := func(e fsnotify.Event) int {
+ // Pull the structural changes to the top.
+ if e.Op.Has(fsnotify.Create) {
+ return 1
+ }
+ if e.Op.Has(fsnotify.Remove) {
+ return 2
+ }
+ if e.Op.Has(fsnotify.Rename) {
+ return 3
+ }
+ if e.Op.Has(fsnotify.Write) {
+ return 4
+ }
+ return 5
+ }
+
+ sort.Slice(events, func(i, j int) bool {
+ // First sort by event type.
+ if eventOrdinal(events[i]) != eventOrdinal(events[j]) {
+ return eventOrdinal(events[i]) < eventOrdinal(events[j])
+ }
+ // Then sort by name.
+ return events[i].Name < events[j].Name
+ })
+
+ return events
}
type fileEventInfo struct {
@@ -494,41 +522,17 @@ func (h *HugoSites) fileEventsApplyInfo(events []fsnotify.Event) []fileEventInfo
return infos
}
-func (h *HugoSites) fileEventsTranslate(events []fsnotify.Event) []fsnotify.Event {
- eventMap := make(map[string][]fsnotify.Event)
-
- // We often get a Remove etc. followed by a Create, a Create followed by a Write.
- // Remove the superfluous events to make the update logic simpler.
- for _, ev := range events {
- eventMap[ev.Name] = append(eventMap[ev.Name], ev)
- }
-
+func (h *HugoSites) fileEventsTrim(events []fsnotify.Event) []fsnotify.Event {
+ seen := make(map[string]bool)
n := 0
for _, ev := range events {
- mapped := eventMap[ev.Name]
-
- // Keep one
- found := false
- var kept fsnotify.Event
- for i, ev2 := range mapped {
- if i == 0 {
- kept = ev2
- }
-
- if ev2.Op&fsnotify.Write == fsnotify.Write {
- kept = ev2
- found = true
- }
-
- if !found && ev2.Op&fsnotify.Create == fsnotify.Create {
- kept = ev2
- }
+ if seen[ev.Name] {
+ continue
}
-
- events[n] = kept
+ seen[ev.Name] = true
+ events[n] = ev
n++
}
-
return events
}