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.

feat(hooks): also set status to failure if post-hook fails

intergrav (Jun 28, 2026, 9:16 AM EDT) 119b7c03 dc65c392

+24 -7
+17 -5
restic.go
··· 594 594 595 595 if prof.PostHook != "" { 596 596 mStatus.SetTitle("Running post-hook...") 597 + var hookErr error 597 598 if ok { 598 - runHook(prof.PostHook, prof, append(hookEnv, "RESTRAY_STATUS=success")...) 599 + hookErr = runHook(prof.PostHook, prof, append(hookEnv, "RESTRAY_STATUS=success")...) 599 600 } else { 600 - runHook(prof.PostHook, prof, append(hookEnv, "RESTRAY_STATUS=failure", "RESTRAY_ERROR="+getProfileFailStatus(idx))...) 601 + hookErr = runHook(prof.PostHook, prof, append(hookEnv, "RESTRAY_STATUS=failure", "RESTRAY_ERROR="+getProfileFailStatus(idx))...) 602 + } 603 + if hookErr != nil { 604 + setProfileFailed(idx, "Post-hook failed") 605 + notifyError("Backup", "Post-hook failed") 601 606 } 602 607 } 603 608 } ··· 682 687 notifyError("Schedule", getProfileFailStatus(idx)) 683 688 if prof.PostHook != "" { 684 689 mStatus.SetTitle("Running post-hook...") 685 - runHook(prof.PostHook, prof, append(hookEnv, "RESTRAY_STATUS=failure", "RESTRAY_ERROR="+getProfileFailStatus(idx))...) 690 + if runHook(prof.PostHook, prof, append(hookEnv, "RESTRAY_STATUS=failure", "RESTRAY_ERROR="+getProfileFailStatus(idx))...) != nil { 691 + notifyError("Schedule", "Post-hook failed") 692 + } 686 693 } 687 694 return 688 695 } ··· 711 718 712 719 if prof.PostHook != "" { 713 720 mStatus.SetTitle("Running post-hook...") 721 + var hookErr error 714 722 if failed { 715 - runHook(prof.PostHook, prof, append(hookEnv, "RESTRAY_STATUS=failure", "RESTRAY_ERROR="+getProfileFailStatus(idx))...) 723 + hookErr = runHook(prof.PostHook, prof, append(hookEnv, "RESTRAY_STATUS=failure", "RESTRAY_ERROR="+getProfileFailStatus(idx))...) 716 724 } else { 717 - runHook(prof.PostHook, prof, append(hookEnv, "RESTRAY_STATUS=success")...) 725 + hookErr = runHook(prof.PostHook, prof, append(hookEnv, "RESTRAY_STATUS=success")...) 726 + } 727 + if hookErr != nil { 728 + setProfileFailed(idx, "Post-hook failed") 729 + notifyError("Schedule", "Post-hook failed") 718 730 } 719 731 } 720 732 }
+7 -2
tray.go
··· 566 566 } 567 567 if prof.PostHook != "" { 568 568 ms.SetTitle("Running post-hook...") 569 + var hookErr error 569 570 if err != nil { 570 - runHook(prof.PostHook, prof, append(hookEnv, "RESTRAY_STATUS=failure", "RESTRAY_ERROR="+msg)...) 571 + hookErr = runHook(prof.PostHook, prof, append(hookEnv, "RESTRAY_STATUS=failure", "RESTRAY_ERROR="+msg)...) 571 572 } else { 572 - runHook(prof.PostHook, prof, append(hookEnv, "RESTRAY_STATUS=success")...) 573 + hookErr = runHook(prof.PostHook, prof, append(hookEnv, "RESTRAY_STATUS=success")...) 574 + } 575 + if hookErr != nil { 576 + setProfileFailed(idx, "Post-hook failed") 577 + notifyError(args[0], "Post-hook failed") 573 578 } 574 579 } 575 580 }()