Skip to content

Commit daa53a3

Browse files
committed
Improve daemon subcommand using fsnotify
1 parent 95b4a16 commit daa53a3

File tree

4 files changed

+70
-10
lines changed

4 files changed

+70
-10
lines changed

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ go 1.15
44

55
require (
66
github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect
7+
github.com/fsnotify/fsnotify v1.7.0
78
github.com/google/go-cmp v0.6.0
89
github.com/jmoiron/sqlx v1.3.5
910
github.com/kr/pretty v0.1.0 // indirect

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbi
22
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
33
github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM=
44
github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
5+
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
6+
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
57
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
68
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
79
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
@@ -24,6 +26,8 @@ github.com/urfave/cli/v2 v2.27.1 h1:8xSQ6szndafKVRmfyeUMxkNUJQMjL1F2zmsZ+qHpfho=
2426
github.com/urfave/cli/v2 v2.27.1/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ=
2527
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
2628
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
29+
golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18=
30+
golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
2731
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
2832
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
2933
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

timefor

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
version https://git-lfs.github.com/spec/v1
2-
oid sha256:049af1dc748aa588344eb66b6faf62f57aeabc16965064e696b2f263a2f9b4b4
3-
size 9434672
2+
oid sha256:11d3a45f9450ece64f77602eaf3a18f5cf14b92ca9ad350aa9aa3055c74ebb97
3+
size 9551664

timefor.go

Lines changed: 63 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
"text/template"
1717
"time"
1818

19+
"github.com/fsnotify/fsnotify"
1920
"github.com/jmoiron/sqlx"
2021
_ "github.com/mattn/go-sqlite3"
2122
"github.com/urfave/cli/v2"
@@ -249,6 +250,7 @@ func newCmd(db *sqlx.DB) error {
249250
intervalToShowBreakReminder := cCtx.Duration("break-interval")
250251
intervalToRepeatBreakReminder := cCtx.Duration("repeat-interval")
251252
hook := cCtx.String("hook")
253+
252254
err := Daemon(db, intervalToUpdateDb, intervalToShowBreakReminder, intervalToRepeatBreakReminder, hook)
253255
if err != nil {
254256
return err
@@ -493,6 +495,10 @@ func Daemon(
493495
) error {
494496
var notified time.Time
495497
var lastHook string
498+
change := make(chan ChangeEvent)
499+
500+
go watchDbFile(change)
501+
496502
for {
497503
activity, err := Latest(db)
498504
if err != nil {
@@ -512,17 +518,12 @@ func Daemon(
512518
}
513519
}
514520
}
515-
if activity.Active() && time.Since(activity.Updated()) > intervalToUpdateDb {
516-
fmt.Printf("updating time for %s\n", activity.Name)
517-
_, err := UpdateIfExists(db, "", false)
518-
if err != nil {
519-
return err
520-
}
521+
if activity.Active() {
521522
duration, err := activeDuration(db)
522523
if err != nil {
523524
return err
524525
}
525-
if activity.Active() && duration > intervalToShowBreakReminder && time.Since(notified) > intervalToRepeatBreakReminder {
526+
if duration > intervalToShowBreakReminder && time.Since(notified) > intervalToRepeatBreakReminder {
526527
args := []string{
527528
"Take a break!",
528529
fmt.Sprintf("Active for %v already", formatDuration(duration)),
@@ -540,10 +541,64 @@ func Daemon(
540541
notified = time.Now()
541542
}
542543
}
543-
time.Sleep(1 * time.Second)
544+
545+
nextUpdate := activity.TimeSince().Truncate(time.Minute) + time.Minute - activity.TimeSince()
546+
log.Printf("next update in %s\n", nextUpdate)
547+
548+
select {
549+
case c := <-change:
550+
log.Println("change", c)
551+
552+
case <-time.After(nextUpdate):
553+
if activity.Active() && time.Since(activity.Updated()) > intervalToUpdateDb {
554+
fmt.Printf("updating time for %s\n", activity.Name)
555+
_, err := UpdateIfExists(db, "", false)
556+
if err != nil {
557+
return err
558+
}
559+
}
560+
}
544561
}
545562
}
546563

564+
type ChangeEvent struct {
565+
Event fsnotify.Event
566+
Error error
567+
}
568+
569+
func watchDbFile(change chan ChangeEvent) error {
570+
watcher, err := fsnotify.NewWatcher()
571+
if err != nil {
572+
return err
573+
}
574+
defer watcher.Close()
575+
576+
go func() {
577+
for {
578+
select {
579+
case event, ok := <-watcher.Events:
580+
if !ok {
581+
return
582+
}
583+
change <- ChangeEvent{Event: event}
584+
585+
case err, ok := <-watcher.Errors:
586+
if !ok {
587+
return
588+
}
589+
change <- ChangeEvent{Error: err}
590+
}
591+
}
592+
}()
593+
594+
if err := watcher.Add(dbFile); err != nil {
595+
return err
596+
}
597+
598+
<-make(chan struct{})
599+
return nil
600+
}
601+
547602
func activeDuration(db *sqlx.DB) (time.Duration, error) {
548603
rows, err := db.Queryx(`SELECT * FROM log ORDER BY started DESC LIMIT 100`)
549604
if err != nil {

0 commit comments

Comments
 (0)