5
5
"database/sql"
6
6
"errors"
7
7
"fmt"
8
- "io/ioutil "
8
+ "io"
9
9
"log"
10
10
"os"
11
11
"os/exec"
@@ -186,13 +186,21 @@ func newCmd(db *sqlx.DB) *cobra.Command {
186
186
if err != nil {
187
187
return err
188
188
}
189
- Daemon (db , sleepTime , breakTime , repeatTime )
189
+ hook , err := cmd .Flags ().GetString ("hook" )
190
+ if err != nil {
191
+ return err
192
+ }
193
+ err = Daemon (db , sleepTime , breakTime , repeatTime , hook )
194
+ if err != nil {
195
+ return err
196
+ }
190
197
return nil
191
198
},
192
199
}
193
200
daemonCmd .Flags ().Duration ("sleep-time" , sleepTimeForDaemon , "sleep time in the loop" )
194
201
daemonCmd .Flags ().Duration ("break-time" , breakTimeForDaemon , "time for a break reminder" )
195
202
daemonCmd .Flags ().Duration ("repeat-time" , repeatTimeForDaemon , "time to repeat a break reminder" )
203
+ daemonCmd .Flags ().StringP ("hook" , "" , "" , "a hook command template" )
196
204
197
205
var dbCmd = & cobra.Command {
198
206
Use : "db" ,
@@ -427,8 +435,9 @@ func Show(db *sqlx.DB, tpl string) error {
427
435
}
428
436
429
437
// Daemon updates the duration of current activity then sleeps for a while
430
- func Daemon (db * sqlx.DB , sleepTime time.Duration , breakTime time.Duration , repeatTime time.Duration ) error {
438
+ func Daemon (db * sqlx.DB , sleepTime time.Duration , breakTime time.Duration , repeatTime time.Duration , hook string ) error {
431
439
var notified time.Time
440
+ var lastHook string
432
441
for {
433
442
_ , err := UpdateIfExists (db , "" , false )
434
443
if err != nil {
@@ -455,10 +464,24 @@ func Daemon(db *sqlx.DB, sleepTime time.Duration, breakTime time.Duration, repea
455
464
}
456
465
err := exec .Command ("notify-send" , args ... ).Run ()
457
466
if err != nil {
458
- log .Printf ("cannot send notification: %v" , err )
467
+ fmt .Printf ("cannot send notification: %v" , err )
459
468
}
460
469
notified = time .Now ()
461
470
}
471
+ if hook != "" {
472
+ cmd , err := activity .Format (hook )
473
+ if err != nil {
474
+ return fmt .Errorf ("cannot render hook command: %v" , err )
475
+ }
476
+ if lastHook != cmd {
477
+ lastHook = cmd
478
+ fmt .Printf ("running hook command: %s\n " , cmd )
479
+ err = exec .Command ("sh" , "-c" , cmd ).Run ()
480
+ if err != nil {
481
+ return fmt .Errorf ("cannot run hook command: %v" , err )
482
+ }
483
+ }
484
+ }
462
485
time .Sleep (sleepTime )
463
486
}
464
487
}
@@ -587,7 +610,7 @@ func Select(db *sqlx.DB) (string, error) {
587
610
fmt .Fprintln (cmdIn , name )
588
611
}
589
612
cmdIn .Close ()
590
- selectedName , err := ioutil .ReadAll (cmdOut )
613
+ selectedName , err := io .ReadAll (cmdOut )
591
614
if err != nil {
592
615
return "" , err
593
616
}
0 commit comments