powerful but friendly backup program that runs in your tray, powered by restic devins.page/restray
go restic system-tray
2

Configure Feed

Select the types of activity you want to include in your feed.

fix: scheduler issues

intergrav (Jun 28, 2026, 7:01 PM EDT) e6d8e0a1 47bd0aa5

+21 -3
+3
restic.go
··· 392 392 393 393 func classifyError(err error, lastStderr string) (string, int) { 394 394 code := exitCode(err) 395 + if code == -1 && strings.Contains(err.Error(), "killed") { 396 + return "Process terminated by system", code 397 + } 395 398 if code == 12 { 396 399 return "Wrong password", code 397 400 }
+18 -3
tray.go
··· 174 174 175 175 sched := cron.New() 176 176 var applyConfig func() 177 + var applyMu sync.Mutex 177 178 178 179 state.onBusyChanged = func(busy bool) { 179 180 if busy { ··· 364 365 } 365 366 366 367 applyConfig = func() { 368 + applyMu.Lock() 369 + defer applyMu.Unlock() 367 370 if isAnyBusy() { 368 371 cfg := loadConfig() 369 372 profileMu.Lock() ··· 519 522 520 523 go func() { 521 524 prev := onBatteryPower() 525 + lastTick := time.Now() 522 526 for range time.NewTicker(60 * time.Second).C { 527 + now := time.Now() 528 + elapsed := now.Sub(lastTick) 529 + lastTick = now 530 + 531 + if elapsed > 2*time.Minute || elapsed < 0 { 532 + log.Print("clock jump detected, restarting scheduler") 533 + applyConfig() 534 + continue 535 + } 536 + 523 537 cur := onBatteryPower() 524 538 if cur != prev { 525 539 prev = cur ··· 681 695 for _, id := range ids { 682 696 want[id] = true 683 697 } 698 + now := time.Now() 684 699 var earliest time.Time 685 700 for _, e := range sched.Entries() { 686 701 if !want[e.ID] { 687 702 continue 688 703 } 689 - if earliest.IsZero() || e.Next.Before(earliest) { 690 - earliest = e.Next 704 + next := e.Schedule.Next(now) 705 + if earliest.IsZero() || next.Before(earliest) { 706 + earliest = next 691 707 } 692 708 } 693 709 if earliest.IsZero() { 694 710 return "" 695 711 } 696 - now := time.Now() 697 712 d := earliest.Sub(now) 698 713 699 714 today := time.Date(now.Year(), now.Month(), now.Day(), 0, 0, 0, 0, now.Location())