batcher.go - hugo - [fork] hugo port for 9front
HTML git clone https://git.drkhsh.at/hugo.git
DIR Log
DIR Files
DIR Refs
DIR Submodules
DIR README
DIR LICENSE
---
batcher.go (2129B)
---
1 // Copyright 2020 The Hugo Authors. All rights reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 // http://www.apache.org/licenses/LICENSE-2.0
7 //
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13
14 package watcher
15
16 import (
17 "time"
18
19 "github.com/fsnotify/fsnotify"
20 "github.com/gohugoio/hugo/watcher/filenotify"
21 )
22
23 // Batcher batches file watch events in a given interval.
24 type Batcher struct {
25 filenotify.FileWatcher
26 ticker *time.Ticker
27 done chan struct{}
28
29 Events chan []fsnotify.Event // Events are returned on this channel
30 }
31
32 // New creates and starts a Batcher with the given time interval.
33 // It will fall back to a poll based watcher if native isn't supported.
34 // To always use polling, set poll to true.
35 func New(intervalBatcher, intervalPoll time.Duration, poll bool) (*Batcher, error) {
36 var err error
37 var watcher filenotify.FileWatcher
38
39 if poll {
40 watcher = filenotify.NewPollingWatcher(intervalPoll)
41 } else {
42 watcher, err = filenotify.New(intervalPoll)
43 }
44
45 if err != nil {
46 return nil, err
47 }
48
49 batcher := &Batcher{}
50 batcher.FileWatcher = watcher
51 batcher.ticker = time.NewTicker(intervalBatcher)
52 batcher.done = make(chan struct{}, 1)
53 batcher.Events = make(chan []fsnotify.Event, 1)
54
55 go batcher.run()
56
57 return batcher, nil
58 }
59
60 func (b *Batcher) run() {
61 evs := make([]fsnotify.Event, 0)
62 OuterLoop:
63 for {
64 select {
65 case ev := <-b.FileWatcher.Events():
66 evs = append(evs, ev)
67 case <-b.ticker.C:
68 if len(evs) == 0 {
69 continue
70 }
71 b.Events <- evs
72 evs = make([]fsnotify.Event, 0)
73 case <-b.done:
74 break OuterLoop
75 }
76 }
77 close(b.done)
78 }
79
80 // Close stops the watching of the files.
81 func (b *Batcher) Close() {
82 b.done <- struct{}{}
83 b.FileWatcher.Close()
84 b.ticker.Stop()
85 }